根据定义,“组合器可以在Map器和还原器之间的每个键上调用0、1或多次。”我想知道mapreduce框架在什么基础上决定了cobiner的发布次数。
3pvhb19x1#
首先,托马斯·荣布吕特的回答很好,我投了我一票。我要补充的唯一一点是,如果定义了Map器,组合器将始终至少每个Map器运行一次,除非Map器输出为空或是单个对。因此,在Map器中不执行合并器是可能的,但可能性很小。
disho6za2#
只是磁盘溢出的数量。排序发生在 MapOutputBuffer 填充,同时进行合并。您可以使用这些参数调整磁盘溢出的数量 io.sort.mb , io.sort.spill.percent , io.sort.record.percent -这些也在文档(书籍和在线资源)中进行了解释。组合器运行的特定数量示例:0->未定义组合器1->定义了一个组合器,mapoutputbuffer填满了一次
MapOutputBuffer
io.sort.mb
io.sort.spill.percent
io.sort.record.percent
1->定义了组合器,mapoutputbuffer被多次填充注意,即使 MapOutputBuffer 从不完全填满,必须在Map阶段结束时刷新此缓冲区,从而触发组合器至少运行一次(如果已定义)。
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。
3条答案
按热度按时间3pvhb19x1#
首先,托马斯·荣布吕特的回答很好,我投了我一票。我要补充的唯一一点是,如果定义了Map器,组合器将始终至少每个Map器运行一次,除非Map器输出为空或是单个对。因此,在Map器中不执行合并器是可能的,但可能性很小。
disho6za2#
只是磁盘溢出的数量。排序发生在
MapOutputBuffer
填充,同时进行合并。您可以使用这些参数调整磁盘溢出的数量
io.sort.mb
,io.sort.spill.percent
,io.sort.record.percent
-这些也在文档(书籍和在线资源)中进行了解释。组合器运行的特定数量示例:
0->未定义组合器
1->定义了一个组合器,mapoutputbuffer填满了一次
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
所以合路器在以下情况下运行:
它没有定义,如果溢出大于minspillsforcombine。minspillforcombine由属性“mapreduce.map.combine.minspills”驱动,该属性的默认值为3。