如何保证组合器在map/reduce中至少运行一次



从一些文章中,我知道组合器将在映射器端和还原器端运行,它将运行0~N次。我知道无论组合器是否被调用,我们的mapreduce程序都应该得到相同的结果。

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

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

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

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

非常感谢!

  • 在溢出期间,在溢出线程写入磁盘之前,线程首先将数据划分为分区,这些分区对应于数据最终要发送到的还原器
  • 在每个分区中,后台线程按键执行内存中的排序,如果有组合器函数,它将在排序的输出上运行
  • 如果至少有三个溢出文件,则在写入输出文件之前,组合器将再次运行
  • 您可以通过重写属性来更改此幻数3:mapreduce.map.combine.minspills
  • 组合器可以在不影响最终结果的情况下在输入上重复运行
  • 如果只有一个或两个溢出,映射输出大小的潜在减少不值得调用组合器的开销

希望这能有所帮助。

如果您需要组合器至少运行一次,那么您就是在滥用组合器。它的作用是一个严格可选的,具有结合/交换性质的折叠值。如果你更多地说明原因,也许可以建议一个更好的设计。

最新更新