首页 > 代码库 > MapReduce 编程 系列九 使用HashPartitioner来调节Reducer的计算负载
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);
MapReduce 编程 系列九 使用HashPartitioner来调节Reducer的计算负载
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。