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

时间:2013-07-25 03:24:11

标签: hadoop mapreduce

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

但我有一个特殊的情况,需要至少召唤一次合并器,有谁知道如何确保?

PS,在maptask.java中,我看到了这句话:

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

如果我将 minSpillsForCombine 设置为零,我是否可以确保至少调用一次合并器?

非常感谢!

2 个答案:

答案 0 :(得分:2)

如果你需要组合器至少运行一次,你就会误用组合器。它的作用是严格可选的,折叠具有关联/交换性质的值。如果您更多地了解原因,可能会建议更好的设计。

答案 1 :(得分:2)

  • 在溢出期间,在溢出线程写入磁盘之前,线程首先将数据划分为与最终将发送到的reducer对应的分区
  • 在每个分区中,后台线程按键执行内存中排序,如果有组合器功能,则在排序的输出上运行。
  • 如果至少有三个溢出文件,则在写入输出文件之前,组合器再次运行
  • 您可以通过覆盖该属性来更改此幻数3: mapreduce.map.combine.minspills
  • 可以在输入上重复运行组合器,而不会影响最终结果。
  • 如果只有一次或两次溢出,地图输出大小的潜在减少不值得调用合并器的开销

希望这有帮助。