0

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

Hadoop 不保证它会为特定的地图输出记录调用多少次[组合器](如果有的话)。换句话说,调用组合函数零次、一次或多次应该从减速器产生相同的输出

此处类似问题的答案基于什么基础 mapreduce 框架决定是否启动组合器建议组合器(如果已定义)将始终被调用一次,因为 MapOutputBuffer 需要被刷新。

可能存在映射器只发出一次的极端情况,这意味着即使定义了组合器,也不会运行。

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

4

1 回答 1

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 由属性“mapreduce.map.combine.minspills”驱动,其默认值为 3。

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

希望这能回答你的问题。

于 2017-04-13T14:03:05.833 回答