mapreduce框架根据什么决定是否启动组合器

eh57zj3b  于 2021-05-31  发布在  Hadoop
关注(0)|答案(3)|浏览(321)

根据定义,“组合器可以在Map器和还原器之间的每个键上调用0、1或多次。”
我想知道mapreduce框架在什么基础上决定了cobiner的发布次数。

3pvhb19x

3pvhb19x1#

首先,托马斯·荣布吕特的回答很好,我投了我一票。我要补充的唯一一点是,如果定义了Map器,组合器将始终至少每个Map器运行一次,除非Map器输出为空或是单个对。因此,在Map器中不执行合并器是可能的,但可能性很小。

disho6za

disho6za2#

只是磁盘溢出的数量。排序发生在 MapOutputBuffer 填充,同时进行合并。
您可以使用这些参数调整磁盘溢出的数量 io.sort.mb , io.sort.spill.percent , io.sort.record.percent -这些也在文档(书籍和在线资源)中进行了解释。
组合器运行的特定数量示例:
0->未定义组合器
1->定义了一个组合器,mapoutputbuffer填满了一次

1->定义了组合器,mapoutputbuffer被多次填充
注意,即使 MapOutputBuffer 从不完全填满,必须在Map阶段结束时刷新此缓冲区,从而触发组合器至少运行一次(如果已定义)。

gkl3eglg

gkl3eglg3#

具有根据条件调用组合器的逻辑的源代码。
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);
 }

所以合路器在以下情况下运行:
它没有定义,如果溢出大于minspillsforcombine。minspillforcombine由属性“mapreduce.map.combine.minspills”驱动,该属性的默认值为3。

相关问题