MapReduce 编程 系列十 使用HashPartitioner来调节Reducer的计算负载

example4演示了如何指定Reducer的数量,本节演示如何使用HashPartitioner将Mapper的输出按照key进行分组后交给Reducer来处理。合理的分组策略将使得每个Reducer获得的计算负载差距不大,从而整体reduce的性能更加均衡。

Reducer的数量由HashPartitioner函数getPartition返回值来确定。

public int getPartition(K2 key, V2 value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
上面的代码表示根据key的hash code 除以2的31次方后取余数,用该余数再次除以reducer的数量,再取余数。得到的结果才是这个key对应的partition的编号。

原因是 Integer.MAX_VALUE是2的31次方-1, 一个数如果和一个2的N次方-1的数 按位与 就 等价于 这个数对2的N次方取余数。

参考我的文档:

http://blog.csdn.net/csfreebird/article/details/7355282

所有计算出来属于同一个partition的key,以及它的value都会被发送到对应的reducer去做处理。

所以结论如下:

partitioner不会改变reducer的数量,而会决定哪些<key,value>进入哪个组,从而改变reducer处理的数据的量


我的example5就是采用了hash partitioner. 在example4的基础上,仅仅修改了LogJob.java的一行代码:

        job.setPartitionerClass(HashPartitioner.class); 

其实如果不设置,默认Hadoop用的就是HashPartitioner。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值