MapReduce的自定义分区
MapReduce有4种Partitioner,如下: HashPartitioner<K,V>,默认的分区。 计算方法:which reducer = (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks HashPartitioner是取key的hashCode码与Integer的最大值做运算,得出的结果和reducer的个数取模,最终得到这个key发送到哪个Reducer上。
KeyFieldBasedPartitioner<K2,V2> KeyFieldBasedPartitioner这是基于hash的Partitioner。他提供了多个区间用于计算hash。当区间数为0的时候,KeyFieldBasedPartitioner就变成了HashPartitioner。
BinaryPartitioner<V> BinaryPartitioner继承与Partitioner<BinaryComparable,V>,是Partitioner的字节码自雷。该类提供leftOffset和rightOffset,在计算which reducer时,仅对key-value中的key的[rightOffset,leftOffset]区间取hash。
TotalOrderPartitioner<K extends WritableComparable<?>,V> TotalOrderPartitioner类可以实现输出的全排序。不同于其他三个Partitioner,这个类不是基于hash的。
1 /**
2 * Hadoop中有4中分区函数,这里我使用的是默认的HashPartitioner
3 * 需要与Mapper的输出保持一致的Key和Value类型,添加如下代码:
4 * //指定自定义分区函数
5 * job.setPartitionerClass(MyPartitioner.class);
6 * //Reduce任务数量必须>=分区数量,生产中一般会设置多于分区数量的Reduce任务
7 * job.setNumReduceTasks(ReduceNumber);
8 * @author mengyao
9 *
10 */
11 static class MyPartitioner extends HashPartitioner<Text, LongWritable> {
12 @Override
13 public int getPartition(Text key, LongWritable value, int numReduceTasks) {
14 //实现自己的分区代码
15 return super.getPartition(key, value, numReduceTasks);
16 }
17
18 }