shuffle和排序

shuffle概述:

MapReduce的Map阶段已经按照key来排好序。系统执行排序的过程---Map作为Reduce的输入,这个过程称为shuffle(洗牌)。

 了解shuffle的过程有利于我们更好的掌握MapReduce的过程从而能够进行调优。从许多方面来看shuffle

是Map-Reduce的心脏,是奇迹发生的地方。

 MapReduce的shuffle过程如下图:

Map首先map task会从split中读取数据(split与block的关系可能为一对多或者一对一,默认情况下是一对一),每个Map都有一个缓冲区默认大小为100M,此属性可以通过io.sort.mb属性控制。当缓冲的内容得到指定的容量时候

io.sort.spill.percent属性可以控制默认是0.8,也就是80%),这时一个后台线程启动负责把缓存中的数据溢写到磁

中,当缓冲区没有满的话,map task和溢写(spill)同事工作,但是如果缓冲区已经填满了的话,那么map会阻塞

,直溢写结束为止。

缓冲区数据溢写到磁盘之前,线程首先会根据被发送到的reducer,将数据划分成不同的分区,在每个分区中,后台

线程会会按照Key来排序,如果此时有个combiner,它会基于排序后输出。

溢写将按照轮训的方式写到maped.local.dir属性指定的目录中,在一个作业相关的子目录中。这样的话会有很多

的溢出来文件。溢出文件会被合并成一个排好序的文件。如果已经指定combiner的话,并且溢写次数至少大于

3时候(min.num.spills.for.combine属性的值),会在输出文件被写之前被执行。combiner会对输入反复进行

而不会影响,这样会使map更加的紧凑,比较进行的combiner次数多。从而导致较少的数据写入到磁盘从而

减少数据的传输。

提高shuffle的过程操作:

 1:设置比较大的内存(这个不太可行,比较数据量大,内存肯定不够用)

2:较少map task对磁盘的IO操作。

3:对map写入到磁盘的数据进行压缩,从而有利于网络传输。maped.compress.map.output设置

成true可以启动此功能。压缩库的格式由maped.map.output..compression.codecd定义。

 4:优化网络的传输,reducer是通过HTTP来得到输出分区的。





猜你喜欢

转载自blog.csdn.net/qq_34796981/article/details/79169432