【问题标题】:How to guarantee the combiner run at least once in map/reduce?如何保证组合器在 map/reduce 中至少运行一次?
【发布时间】:2016-07-24 17:55:35
【问题描述】:

从一些文章中,我知道 combiner 会在 mapper 端和 reducer 端运行,并且会运行 0~N 次。而且我知道无论是否调用组合器,我们的 mapreduce 程序都应该得到相同的结果。

但我有一种特殊情况需要至少调用一次组合器,有谁知道如何确保这一点?

PS,在maptask.java,我看到了一行:

if (null == combinerClass || numSpills < minSpillsForCombine) {
    Merger.writeFile(kvIter, writer, reporter);
} else {
    combineCollector.setWriter(writer);
    combineAndSpill(kvIter, combineInputCounter);
}

如果我将 minSpillsForCombine 设置为零,我能否确保至少调用一次组合器?

非常感谢!

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:
    • 在溢出期间,在溢出线程写入磁盘之前,该线程首先将数据划分为与它们最终将被发送到的减速器相对应的分区
    • 在每个分区内,后台线程执行内存中的key排序,如果有combiner函数,则在排序的输出上运行
    • 如果至少有三个溢出文件,则在写入输出文件之前,组合器会再次运行
    • 您可以通过覆盖以下属性来更改此幻数 3:ma​​preduce.map.combine.minspills
    • 组合器可以在输入上重复运行,而不会影响最终结果。
    • 如果只有一两次溢出,地图输出大小的潜在减少不值得调用组合器的开销

    希望这会有所帮助。

    【讨论】:

    • 是的,但我不认为组合器可以保证运行,即使存在。
    【解决方案2】:

    如果您需要组合器至少运行一次,那么您就是在滥用组合器。它的角色是严格可选的,折叠具有关联/交换性质的值。如果您详细说明原因,可能会提出更好的设计建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多