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 }

 

转载于:https://www.cnblogs.com/mengyao/archive/2013/02/05/4865576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值