分区!hadoop是如何做到的?使用哈希函数?默认函数是什么?

iibxawm4  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(364)

分区是确定哪个reducer示例将接收哪些中间键和值的过程。每个Map器必须为其所有输出(键、值)对确定哪个reducer将接收它们。对于任何键,不管是哪个mapper示例生成的,目标分区都是同一个问题:hadoop是如何生成的?使用哈希函数?默认函数是什么?

xa9qqrwz

xa9qqrwz1#

hadoop中的默认分区器是 HashPartitioner 它有一个名为 getPartition . 它需要 key.hashCode() & Integer.MAX_VALUE 并利用reduce任务数求出模数。
例如,如果有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); ). 例如,如果执行二次排序操作,这尤其有用。

相关问题