繁体   English   中英

Hadoop组合器排序阶段

[英]Hadoop combiner sort phase

使用指定的组合器运行MapReduce作业时,组合器是否在排序阶段运行? 我知道组合器在每个溢出的mapper输出上运行,但似乎在合并排序的中间步骤中运行也是有益的。 我在这里假设在排序的某些阶段,某些等效键的映射器输出在某些时候保存在内存中。

如果目前没有这种情况,是否有特殊原因,或者只是尚未实施的内容?

提前致谢!

组合器可以节省网络带宽。

mapoutput直接排序:

sorter.sort(MapOutputBuffer.this, kvstart, endPosition, reporter);

这在实际映射完成后立即发生。 在通过缓冲区的迭代期间,它检查是否已经设置了组合器,如果是,则组合记录。 如果没有,它会直接溢出到磁盘上。

如果你想亲自看看它,那么重要的部分就在MapTask

    sorter.sort(MapOutputBuffer.this, kvstart, endPosition, reporter);
    // some fields
    for (int i = 0; i < partitions; ++i) {
        // check if configured
        if (combinerRunner == null) {
          // spill directly
        } else {
            combinerRunner.combine(kvIter, combineCollector);
        }
    }

这是保存磁盘空间和网络带宽的正确阶段,因为很可能必须传输输出。 在合并/混洗/排序阶段,它没有用处,因为与地图结束时的组合器运行相比,你必须处理更多的数据量。

请注意,Web界面中显示的排序阶段具有误导性。 这只是纯粹的融合。

在处理的地图方面,有两个运行Combiner的机会。 (一个非常好的在线参考来自Tom White的“Hadoop:The Definitive Guide” - https://www.inkling.com/read/hadoop-definitive-guide-tom-white-3rd/chapter-6/shuffle-and-排序

在完成每个分区的密钥的内存中排序之后,以及在将这些已排序的数据写入磁盘之前,第一个机会来自映射端。 此时运行Combiner的动机是减少最终写入本地存储的数据量。 通过在此处运行Combiner,我们还可以减少在下一步中需要合并和排序的数据量。 所以对于发布的原始问题,是的,Combiner已经在这个早期步骤中应用了。

第二次机会在合并和排序溢出文件后立即出现。 在这种情况下,运行Combiner的动机是减少最终通过网络发送到Reducer的数据量。 此阶段受益于Combiner的早期应用,这可能已经减少了此步骤要处理的数据量。

组合器只会运行你如何理解它。

我怀疑组合器仅以这种方式工作的原因是它减少了发送到reducer的数据量。 在许多情况下,这是一个巨大的收获。 同时,在reducer中,数据已经存在,并且无论是在排序/合并中还是在reduce逻辑中将它们组合在一起,实际上并不重要(它可以在现在或以后完成)。

所以,我想我的观点是:你可能会像你在合并中所说的那样通过组合获得收益,但它不会像地图侧组合器那样多。

我没有查看代码,但是参考了Hadoop:Tom White第3版的权威指南,它确实提到如果指定了组合器,它将在reducer的合并阶段运行。 以下摘自文字:

“如果映射输出足够小(映射缓冲区的大小由mapred.job.shuffle.input.buffer.percent控制,它指定用于此目的的堆的比例),则将映射输出复制到reduce任务JVM的内存中。否则,它们被复制到磁盘。当内存缓冲区达到阈值大小(由mapred.job.shuffle.merge.percent控制),或达到阈值数量的地图输出(mapred.inmem.merge.threshold)时,它被合并并溢出到磁盘。 如果指定了合并器,它将在合并期间运行,以减少写入磁盘的数据量 。“

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM