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

xfyts7mz  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(385)

从一些文章中,我知道合并器将运行在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设置为零,是否可以确保至少调用一次合并器?
谢谢!

jyztefdp

jyztefdp1#

如果你需要合路器至少运行一次,那就是你误用了合路器。它的角色是一个严格可选的角色,折叠具有关联/交换性质的值。如果你多说一点原因,也许可以提出一个更好的设计。

ql3eal8s

ql3eal8s2#

在溢出期间,在溢出线程写入磁盘之前,线程首先将数据划分为与最终将发送到的还原器相对应的分区。
在每个分区中,后台线程执行内存中的按键排序,如果有组合器函数,则在排序的输出上运行。
如果至少有三个溢出文件,则在写入输出文件之前,将再次运行合并器。
您可以通过重写属性mapreduce.map.combine.mins来更改这个神奇的数字3
组合器可以在输入端重复运行,而不影响最终结果。
如果只有一个或两个溢出,Map输出大小的潜在减少不值得调用合并器的开销。
希望这有帮助。

相关问题