hadoopmapreduce运行组合器时的最终源代码

xuo3flqw  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(290)

像这样的问题已经有不少了,答案相互矛盾。我在文献和博客上也发现了相互矛盾的说法。在书中,hadoop,权威指南,它说
hadoop不能保证它会为一个特定的map输出记录调用[combiner]多少次。换言之,调用组合器函数0,一次或多次应该从减速机产生相同的输出
这里类似问题的答案是mapreduce框架在什么基础上决定是否启动组合器,这表明如果定义了组合器,则在需要刷新mapoutputbuffer时总是调用一次组合器。
可能存在Map器只发射一次的边缘情况,这意味着即使定义了合并器,也不会运行。
我的问题是:这个问题的答案有确切的来源吗?当然,我已经搜索了hadoop文档,但是找不到任何东西。

hwamh0ep

hwamh0ep1#

hadoop框架的目的是为用户/开发人员提供一个简单的界面,以便开发在分布式环境中运行的代码,而不需要用户/开发人员考虑/处理分布式系统的复杂性。
要回答您的问题,您可以阅读源代码,其中包含根据条件调用组合器的逻辑。
1950线-1955线https://github.com/apache/hadoop/blob/0b8a7c18ddbe73b356b3c9baf4460659ccaee095/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/maptask.java

if (combinerRunner == null || numSpills < minSpillsForCombine) {
     Merger.writeFile(kvIter, writer, reporter, job);
 } else {
     combineCollector.setWriter(writer);
     combinerRunner.combine(kvIter, combineCollector);
 }

所以合路器不会运行,如果:
未定义,或
如果溢油量少于5分钟。minspillforcombine由属性“mapreduce.map.combine.minspills”驱动,该属性的默认值为3。
由于大多数hadoop属性都是可配置的,因此行为和性能取决于如何配置属性。
希望这能回答你的问题。

相关问题