分区是确定哪个reducer示例将接收哪些中间键和值的过程。每个Map器必须为其所有输出(键、值)对确定哪个reducer将接收它们。对于任何键,不管是哪个mapper示例生成的,目标分区都是同一个问题:hadoop是如何生成的?使用哈希函数?默认函数是什么?
xa9qqrwz1#
hadoop中的默认分区器是 HashPartitioner 它有一个名为 getPartition . 它需要 key.hashCode() & Integer.MAX_VALUE 并利用reduce任务数求出模数。例如,如果有10个reduce任务, getPartition 将为所有键返回值0到9。代码如下:
HashPartitioner
getPartition
key.hashCode() & Integer.MAX_VALUE
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); ). 例如,如果执行二次排序操作,这尤其有用。
Partitioner
job.setPartitionerClass(CustomPartitioner.class);
1条答案
按热度按时间xa9qqrwz1#
hadoop中的默认分区器是
HashPartitioner
它有一个名为getPartition
. 它需要key.hashCode() & Integer.MAX_VALUE
并利用reduce任务数求出模数。例如,如果有10个reduce任务,
getPartition
将为所有键返回值0到9。代码如下:
要创建自定义分区器,可以扩展
Partitioner
,创建方法getPartition
,然后在驱动程序代码中设置分区器(job.setPartitionerClass(CustomPartitioner.class);
). 例如,如果执行二次排序操作,这尤其有用。