分区是确定哪个reducer 实例将接收哪些中间键和值的过程。每个映射器必须为它的所有输出(键、值)对确定哪个reducer 将接收它们。任何一个key,不管是哪个mapper实例生成的,目的分区都是一样的问题:hadoop是怎么做的?使用哈希函数?默认功能是什么?
问问题
11898 次
1 回答
19
Hadoop 中的默认分区器是HashPartitioner
具有称为getPartition
. 它key.hashCode() & Integer.MAX_VALUE
使用减少任务的数量获取并找到模数。
例如,如果有 10 个 reduce 任务,getPartition
将为所有键返回值 0 到 9。
这是代码:
public class HashPartitioner<K, V> extends Partitioner<K, V> {
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
要创建自定义分区器,您将扩展Partitioner
、创建一个方法getPartition
,然后在驱动程序代码 ( job.setPartitionerClass(CustomPartitioner.class);
) 中设置您的分区器。例如,这在进行二次排序操作时特别有用。
于 2013-08-27T16:45:48.460 回答