控制Hadoop 2中的reducer shuffle合并内存

时间:2015-09-18 11:09:58

标签: hadoop

我想了解如何在MapReduce Job的reduce阶段使用内存,所以我可以用指定的方式控制设置。

如果我理解正确,减速器首先抓取其地图输出并将它们留在内存中达到某个阈值。控制它的设置是:

  • mapreduce.reduce.shuffle.merge.percent:启动内存中合并的使用阈值,表示为分配给存储内存映射输出的总内存的百分比,由mapreduce.reduce.shuffle.input定义.buffer.percent。
  • mapreduce.reduce.input.buffer.percent:内存的百分比 - 相对于最大堆大小 - 在reduce期间保留映射输出。当shuffle结束时,内存中任何剩余的map输出必须消耗小于此阈值才能开始reduce。

接下来,这些溢出的块合并。似乎以下选项控制了shuffle使用了多少内存:

但是,有一个设置:

但目前尚不清楚该百分比的适用价值。 是否有更多关于这些值的信息,即它们控制的内容以及它们的区别?

最后,在合并完成后,将对输入运行reduce过程。在[Hadoop book] [1]中,我发现最后的合并步骤直接为reducers提供了帮助。但是,mapreduce.reduce.input.buffer.percent = 0的默认值与此相矛盾,表明在reducers启动之前所有内容都溢出到磁盘。 是否有任何关于其中一个解释是否正确的参考?

[1]:Hadoop,权威指南,第四版,p。 200

1 个答案:

答案 0 :(得分:0)

以下是mapreduce.reduce.shuffle.memory.limit.percent的使用方法,其百分比表示整个reducer内存的0.70%。这将是数据可以保存在内存中的最大字节数,用于单次洗牌

maxSingleShuffleLimit = (long)(maxSize * MAX_SINGLE_SHUFFLE_SEGMENT_FRACTION);
//MAX_SINGLE_SHUFFLE_SEGMENT_FRACTION=mapreduce.reduce.shuffle.memory.limit.percent(0.25 f)
maxSize = (int)(conf.getInt("mapred.job.reduce.total.mem.bytes",(int)Math.min(Runtime.getRuntime().maxMemory(), Integer.MAX_VALUE))* maxInMemCopyUse);//maxInMemCopyuse(mapred.job.shuffle.input.buffer.percent - 0.70f)

此属性用于reducer的复制阶段。如果所需的地图输出大于maxShufflelimit,则数据将移至磁盘,否则将保留在内存中。

属性mapreduce.reduce.input.buffer.percent完全不同。 复制完所有数据并完成所有合并后,在reducer启动之前,只检查存储在内存中的数据是否超出此限制。

你可以参考this代码(但是它应该是旧的mapred它应该提供一个见解)关于如何使用maxSingleShuffleLimit和其他属性。