您的当前位置:首页MR的shuffle调优

MR的shuffle调优

2024-12-14 来源:哗拓教育

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设置,还得看具体业务情景,一般不修改

对map输出进行压缩


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

显示全文