【发布时间】:2015-09-03 13:51:10
【问题描述】:
分区是确定哪个reducer 实例将接收哪个中间键和值的过程。每个映射器必须为它的所有输出(键、值)对确定哪个reducer 将接收它们。对于任何 key,无论是哪个 mapper 实例生成它,目标分区都必须是相同的 问题:hadoop 是如何实现的?使用哈希函数?默认功能是什么?
【问题讨论】:
标签: hadoop hash partitioning
分区是确定哪个reducer 实例将接收哪个中间键和值的过程。每个映射器必须为它的所有输出(键、值)对确定哪个reducer 将接收它们。对于任何 key,无论是哪个 mapper 实例生成它,目标分区都必须是相同的 问题:hadoop 是如何实现的?使用哈希函数?默认功能是什么?
【问题讨论】:
标签: hadoop hash partitioning
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);) 中设置您的分区器。例如,这在进行二次排序操作时特别有用。
【讨论】: