我正在阅读原始的MapReduce论文。我的理解是,在使用数百GB的数据时,传输如此多数据的网络带宽可能是MapReduce作业的瓶颈。对于地图任务,我们可以通过在已包含任何给定拆分数据的工作人员上安排地图任务来减少网络带宽,因为从本地磁盘读取不需要网络带宽。
然而,洗牌阶段似乎是一个巨大的瓶颈。 reduce任务可以从所有map任务中接收中间键/值对,几乎所有这些中间键/值对都将通过网络流式传输。
使用数百GB或更多数据时,是否必须使用合并器来获得有效的MapReduce作业?
答案 0 :(得分:1)
如果组合器能够适应这种情况,那么它就像一个局部减速器一样起着重要的作用,因此它不会发送所有数据,而只会发送少量值或局部聚合值,但组合器不能应用于所有情况。
如果reduce函数是可交换的和关联的,那么它可以用作组合器。
就像Median一样,它不会起作用。
组合器无法在所有情况下使用。
还有其他可以调整的参数,如:
当地图发出输出时,它直接不会进入磁盘,它会转到100 MB循环缓冲区,当填充80%时,它会将记录溢出到磁盘中。
所以你可以增加缓冲区大小并增加阈值保持值,在这种情况下溢出会更少。
如果有这么多泄漏,那么溢出会合并成一个文件,我们可以使用溢出因子。
有这样的线程可以将数据从本地磁盘复制到reducer jvm,因此可以增加它们的数量。
压缩可以在中级和最终级别使用。
因此,Combiner不是唯一的解决方案,并且不会在所有情况下使用。
答案 1 :(得分:1)
让我们说映射器正在发射(字,计数)。如果你不使用组合器,那么如果一个映射器有100次单词abc,那么reducer必须拉(abc,1)100次让我们说(word,count)的大小是7个字节。如果没有组合器,减速器必须提取7 * 100字节的数据,而使用组合器,减速器只需要提取7个字节的数据。此示例仅说明了组合器如何减少网络流量。 注意:这是一个模糊的例子,只是为了使理解更简单。