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     }

 

posted @ 2013-02-05 16:31  孟尧  阅读(323)  评论(0编辑  收藏  举报