我想了解如何在MapReduce Job的reduce阶段使用内存,所以我可以用指定的方式控制设置。
如果我理解正确,减速器首先抓取其地图输出并将它们留在内存中达到某个阈值。控制它的设置是:
接下来,这些溢出的块合并。似乎以下选项控制了shuffle使用了多少内存:
但是,有一个设置:
但目前尚不清楚该百分比的适用价值。 是否有更多关于这些值的信息,即它们控制的内容以及它们的区别?
最后,在合并完成后,将对输入运行reduce过程。在[Hadoop book] [1]中,我发现最后的合并步骤直接为reducers提供了帮助。但是,mapreduce.reduce.input.buffer.percent = 0的默认值与此相矛盾,表明在reducers启动之前所有内容都溢出到磁盘。 是否有任何关于其中一个解释是否正确的参考?
[1]:Hadoop,权威指南,第四版,p。 200
答案 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和其他属性。