hadoop2中减速机shuffle合并内存的控制

hrysbysz  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(289)

我想了解内存在mapreduce作业的reduce阶段是如何使用的,这样我就可以以指定的方式控制设置。
如果我理解正确,reducer首先获取其map输出,并将它们留在内存中,直到达到某个阈值。控制此操作的设置包括:
mapreduce.reduce.shuffle.merge.percent:启动内存中合并的使用阈值,表示为分配给存储内存中Map输出的总内存的百分比,由mapreduce.reduce.shuffle.input.buffer.percent定义。
mapreduce.reduce.input.buffer.percent:相对于最大堆大小,在reduce期间保留Map输出的内存百分比。当洗牌结束时,内存中任何剩余的map输出在reduce开始之前必须消耗小于该阈值的数据。
接下来,合并这些溢出的块。下面的选项似乎控制了洗牌所用的内存量:
mapreduce.reduce.shuffle.input.buffer.percent:洗牌期间从最大堆大小分配到存储Map输出的内存百分比。
不过,还有一个背景:
mapreduce.reduce.shuffle.memory.limit.percent:单个随机播放可以使用的内存限制的最大百分比。
但目前尚不清楚这个百分比适用于什么值。是否有关于这些值的更多信息,即它们控制什么以及它们之间的区别?
最后,合并完成后,对输入运行reduce进程。在[hadoop book][1]中,我发现最后一个合并步骤直接为减速机提供数据。但是,mapreduce.reduce.input.buffer.percent=0的默认值与此相矛盾,表示在还原程序启动之前,所有内容都已溢出到磁盘。这些解释中哪一个是正确的,有什么参考依据吗?
[1] :hadoop,权威指南,第四版,p。200

qzlgjiam

qzlgjiam1#

下面是如何使用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)

此属性用于还原程序的复制阶段。如果所需的Map输出大于maxshufflelimit,则数据将被移动到磁盘,否则将保留在内存中。
财产 mapreduce.reduce.input.buffer.percent 完全不同。一旦复制了所有数据并完成了所有合并,在reducer启动之前,它只检查存储在内存中的数据是否超过此限制。
您可以参考这段代码(不过对于旧的mapred,它应该提供一个细节),了解如何使用maxsingleshuffleimit和其他属性。

相关问题