1 public int getPartition(IntWritable key,IntWritable value,int numPartitions){ 2 int Maxnumber = 12345; 3 int bound = Maxnumber/numPartitions +1; 4 int keynumber = key.get(); 5 6 System.out.println("numPartition:"+numPartitions); 7 for(int i = 0;i<numPartitions;i++){ 8 if(keynumber<bound *i && keynumber >= bound*(i-1)) 9 return (i-1); 10 } 11 return 0; 12 } 13 14 }
//if you don't configure the parameter, and it's not configured in mapred-site.xml (mapred.reduce.tasks
) then the default is 1.
numPartitions的值 在mapred-site.xml中定义,默认是1。
MapReduce过程中就有排序,它是按照key值进行排序,如果key为封装int的IntWritable类型,那么MapReduce按照数字大小对key排序,如果key为封装String的Text类型,那么MapReduce按照字典顺序对字符串进行排序。 Reduce自动排序的数据仅仅是发送到自己所在节点的数据,使用默认的排序并不能保证全局的顺序,因为在排序前还有一个partition的过程,默认无法保证分割后的各个Reduce上的数据整体上是有序的,所以要使用默认的排序,还必须定义自己的Partition类。保证执行Partition过程之后所有Reduce上的数据在整体上是有有序的,然后再对局部Reduce上的数据进行默认排序,这样才能保证整体有序。