【问题标题】:Custom partitioner example自定义分区器示例
【发布时间】:2011-10-25 22:26:06
【问题描述】:

我正在尝试为有些倾斜的输入数据编写一个新的 Hadoop 作业。一个类比是 Hadoop 教程中的字数统计示例,除了让我们说一个特定的单词出现很多次。

我想要一个分区函数,其中一个键将根据它们通常的哈希分区映射到多个减速器和剩余键。这可能吗?

提前致谢。

【问题讨论】:

    标签: hadoop mapreduce partitioning


    【解决方案1】:

    不要以为在 Hadoop 中同一个键可以映射到多个 reducer。但是,可以对键进行分区,以便减速器或多或少地均匀加载。为此,应该对输入数据进行采样,并对键进行适当的分区。检查Yahoo Paper 以获取有关自定义分区器的更多详细信息。 Yahoo 排序代码在 org.apache.hadoop.examples.terasort 包中。

    假设输入中的键 A 有 10 行,B 有 20 行,C 有 30 行,D 有 60 行。然后可以将密钥 A、B、C 发送到减速器 1,并将密钥 D 发送到减速器 2,以使减速器上的负载均匀分布。要对键进行分区,必须进行输入采样以了解键的分布情况。

    这里还有一些建议可以让作业更快地完成。

    JobConf 上指定Combiner 以减少发送到reducer 的key 数量。这也减少了 mapper 和 reducer 任务之间的网络流量。不过,不能保证 Hadoop 框架会调用组合器。

    此外,由于数据有偏差(某些键会反复重复,比如“工具”),您可能需要increase the # of reduce tasks 以更快地完成作业。这样可以确保在 reducer 处理“工具”时,其他数据由其他 reducer 并行处理。

    【讨论】:

    • 快速提问,除了减少减少任务的数量以避免不必要的处理之外,均匀分布还有其他性能优势吗?
    • 不明白如何平均分配与reducer 任务中不必要的处理相关 - 平均分配reducer 上的负载将确保作业更快地完成。否则,作业的总时间将受到耗时最多的 reducer 的影响。为此Hadoop支持Speculative Execution,效率不高。
    【解决方案2】:

    如果出于性能原因将数据拆分到多个 reducer,那么您需要第二个 reducer 将数据聚合到最终结果集中。

    Hadoop 有一个内置功能可以做类似的事情:组合器。

    combiner 是一种“reducer”类型的功能。 这确保了在 map 任务中可以对数据进行部分归约,从而减少需要稍后处理的记录数量。

    在基本的 wordcount 示例中,combiner 与 reducer 完全相同。 请注意,某些算法您需要对这两种算法进行不同的实现。 我也有一个项目,由于算法的原因,组合器是不可能的。

    【讨论】:

    • 不确定,如果同一个 key 可以在多个 reducer 中拆分,那么第二个 reducer (M -> R -> R) 的选项可能不会出现。当数据非常大时,带有输入采样的自定义分区器可能是更好的选择,就像在 Y!兆排序。
    • 为什么不呢? getPartition() 获取键和值作为参数并返回一个整数。我想,根据值而不是键返回一个分区由程序员决定。可以在这里找到一个示例:hadooptutorial.wikispaces.com/Custom+partitioner
    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多