【问题标题】:Partitioning! how does hadoop make it? Use a hash function? what is the default function?分区! hadoop是怎么做到的?使用哈希函数?默认功能是什么?
【发布时间】:2015-09-03 13:51:10
【问题描述】:

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

【问题讨论】:

    标签: hadoop hash partitioning


    【解决方案1】:

    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);) 中设置您的分区器。例如,这在进行二次排序操作时特别有用。

    【讨论】:

    • @tommy_o 如何调用 getPartition(..) 方法?什么叫这种方法?在哪里调用这个方法?
    • @BurakKarasoy 当您创建一个 Job 对象来配置 MR 作业属性时,它将为您提供一个方法来声明 CustomPartitioner(如果有),如上面作者指定的那样。在 Map 任务完成并且数据溢出到磁盘后,此自定义分区器在 MR 框架内部被调用
    猜你喜欢
    • 2013-10-25
    • 2011-05-01
    • 1970-01-01
    • 2010-11-11
    • 2010-09-07
    • 2013-08-07
    • 2011-06-04
    • 2011-08-18
    相关资源
    最近更新 更多