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。

版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-09-21 15:54  zfyouxi  阅读(229)  评论(0编辑  收藏  举报