已经有很多像这样的问题,答案相互矛盾。我还在文献和博客中发现了相互矛盾的陈述。在书中,Hadoop,权威指南,它说
Hadoop无法保证为特定地图输出记录调用[合并器]的次数(如果有的话)。换句话说,调用组合器函数为零,一次或多次应该从reducer
产生相同的输出
此处On what basis mapreduce framework decides whether to launch a combiner or not对类似问题的回答表明,如果需要刷新MapOutputBuffer,将始终调用一个组合器(如果已定义)。
可能存在一个边缘情况,即映射器只发出一次,这意味着组合器即使已定义也不会运行。
我的问题是:这个问题的答案是否有明确的来源?当然,我搜索了Hadoop文档,但找不到任何内容。
答案 0 :(得分:1)
Hadoop框架旨在为用户/开发人员提供一个简单的界面,以开发在分布式环境中运行的代码,而无需用户/开发人员思考/处理分布式系统的复杂性。
要回答您的问题,您可以阅读具有根据条件调用组合器的逻辑的源代码。
if (combinerRunner == null || numSpills < minSpillsForCombine) {
Merger.writeFile(kvIter, writer, reporter, job);
} else {
combineCollector.setWriter(writer);
combinerRunner.combine(kvIter, combineCollector);
}
如果以下情况,那么Combiner就不会运行:
由于大多数hadoop属性都是可配置的,因此行为和性能取决于您配置属性的方式。
希望这能回答你的问题。