从一些文章中,我知道合并器将运行在Map器侧和还原器侧,它将运行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条答案
按热度按时间jyztefdp1#
如果你需要合路器至少运行一次,那就是你误用了合路器。它的角色是一个严格可选的角色,折叠具有关联/交换性质的值。如果你多说一点原因,也许可以提出一个更好的设计。
ql3eal8s2#
在溢出期间,在溢出线程写入磁盘之前,线程首先将数据划分为与最终将发送到的还原器相对应的分区。
在每个分区中,后台线程执行内存中的按键排序,如果有组合器函数,则在排序的输出上运行。
如果至少有三个溢出文件,则在写入输出文件之前,将再次运行合并器。
您可以通过重写属性mapreduce.map.combine.mins来更改这个神奇的数字3
组合器可以在输入端重复运行,而不影响最终结果。
如果只有一个或两个溢出,Map输出大小的潜在减少不值得调用合并器的开销。
希望这有帮助。