6

分区是确定哪个reducer 实例将接收哪些中间键和值的过程。每个映射器必须为它的所有输出(键、值)对确定哪个reducer 将接收它们。任何一个key,不管是哪个mapper实例生成的,目的分区都是一样的问题:hadoop是怎么做的?使用哈希函数?默认功能是什么?

4

1 回答 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 回答