MR的shuffle调优

作者: 终生学习丶 | 来源:发表于2017-10-29 11:46 被阅读67次

MR的shuffle发生在什么过程

shuffle主要发生在 Map端的spill 和 reduce端sort,copy过程

Map端: 在Map端会发生shuffle的阶段主要是spill过程. map的输出以KV的形式写入一个叫KVbuffer的环形缓冲区,kvbuffer包括kvmeta(记录的是元数据信息)和kv(真正的信息),当缓冲区的数量值达到阈值(默认为80%),溢出行为会在一个后台开启一个sortAndSpill线程,然后开始写数据,在磁盘上会产生一个索引文件和一个数据文件(分区且有序的),这就是spill过程。注: 临界值(80%)会被触发,但是不会阻塞

map的环形缓冲区

reduce端: reduce端主要包括sort过程和copy过程. reduce的数据都是从map端过来的,且是分区有序的,先map后reduce,但是面对多个job,map和redcue是同时进行的,一边sort,一边copy,同时进行.会产生大量的io和内存消耗,因此需要我们调优.


Map端优化

原则: 避免写入多个spill文件可能达到最好的性能,一个spill文件是最好的

kvbuffer环形缓冲区

缓冲区的默认大小是100M,可以通过mapreduce.task.io.sort.mb这个属性来设置,具体配置得根据具体业务情景来分析. 一般不修改

缓冲区阈值

开始spill的Buffer比例默认为80%,可以通过mapreduce.map.sort.spill.percent设置,还得看具体业务情景,一般不修改

合并Spill文件
mapreduce.task.io.sort.factor属性配置每次最多合并多少个文件,默认为10,即一次最多合并10个spill文件.如果spill文件数量大于mapreduce.map.combiner.minspills配置的数,则在合并文件写入之前,会再次运行combiner。如果spill文件数量太少,运行combiner的收益可能小于调用的代价。

对map输出进行压缩

在数据量大的时候,可以对map输出进行压缩,要启用压缩,将mapreduce.map.output.compress设为true,并使用mapreduce.map.output.compress.codec设置使用的压缩算法


Reduce端优化

原则: 如果能够让所有数据都保存在内存中,可以达到最佳的性能

copy线程数量

copy是用来从map任务中提取数据的,默认为5个copy线程,可以通过mapreduce.reduce.shuffle.parallelcopies配置

内存分配

如果能够让所有数据都保存在内存中,可以达到最佳的性能。通常情况下,内存都保留给reduce函数,但是如果reduce函数对内存需求不是很高,将mapreduce.reduce.merge.inmem.threshold(触发合并的map输出文件数)设为0,mapreduce.reduce.input.buffer.percent(用于保存map输出文件的堆内存比例)设为1.0

相关文章

网友评论

    本文标题:MR的shuffle调优

    本文链接:https://www.haomeiwen.com/subject/egaepxtx.html