Hadoop MapReduce运行组合器时的确切来源

时间:2017-04-13 13:32:27

标签: hadoop mapreduce combiners

已经有很多像这样的问题,答案相互矛盾。我还在文献和博客中发现了相互矛盾的陈述。在书中,Hadoop,权威指南,它说

  

Hadoop无法保证为特定地图输出记录调用[合并器]的次数(如果有的话)。换句话说,调用组合器函数为零,一次或多次应该从reducer

产生相同的输出

此处On what basis mapreduce framework decides whether to launch a combiner or not对类似问题的回答表明,如果需要刷新MapOutputBuffer,将始终调用一个组合器(如果已定义)。

可能存在一个边缘情况,即映射器只发出一次,这意味着组合器即使已定义也不会运行。

我的问题是:这个问题的答案是否有明确的来源?当然,我搜索了Hadoop文档,但找不到任何内容。

1 个答案:

答案 0 :(得分:1)

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);
 }

如果以下情况,那么Combiner就不会运行:

  • 未定义,或
  • 如果溢出量小于minSpillsForCombine。 minSpillForCombine由属性&#34; mapreduce.map.combine.minspills&#34;其默认值为3.

由于大多数hadoop属性都是可配置的,因此行为和性能取决于您配置属性的方式。

希望这能回答你的问题。