MapReduce Shuffle
Shuffle简介
shuffle的本意是洗牌,把一组有规则的数据打乱成无规则的数据。而在MR中,Shuffle更像是洗牌的逆过程,指的是将map端的无规则数据按指定规则打乱“打乱”成具有一定规则的数据,以便reduce端接收处理。
在shuffle之前,也就是在map阶段,MapReduce会对要处理的数据进行分片(split)操作,为每一个分片分配一个MapTask任务。 接下来map会对每一个分片中的每一行数据进行处理得到键值对(key,value)此时得到的键值对又要做“中间结果”。此后便进入reduce阶段,可以看出Shuffle阶段的作用是处理“中间结果”。由于Shuffle涉及到了磁盘的读写和网络的传输,因此Shuffle过程直接决定了整个程序的运行效率。
shuffle的过程基本要求:
1.完整的从map task端拉取数据到reduce task端。
2.在拉取数据的过程中,尽可能减少网络消耗。
3.尽可能减少磁盘IO对task执行效率的影响。
shuffle过程
1)Map端的shuffle:
Map端会处理数据并产生中间结果,这个中间结果会写到本地磁盘。Map的输出结果首先被缓存到内存,当缓存区(环状缓冲区)达到80%(默认大小为100MB),就会启动溢写操作。当前启动溢写操作时,首先把缓存中的数据进行分区,对每个分区的数据进行排序、合并。之后再写入到磁盘中,每次溢写都会生成新的磁盘文件,随着Job执行,被溢写出到磁盘的文件会越来越多,在Map任务全部结束之前,这些溢写被归并成一个大的磁盘文件,然后通知相应的Reduce任务来领取属于自己的数据。
2)Reduce端的Shuffle
Reduce端的shuffle主要包括三个阶段,copy、merge和reduce。
每个reduce task负责处理一个分区的文件,以下是reduce task的处理流程:
1.reduce task从每个map task的结果文件中拉取对应分区的数据。因为数据在map阶段是分好区的,并且会有一个额外的索引文件记录每个分区的起始偏移量。所以reduce task取数据的时候直接根据偏移量拉就ok了。
2.reduce task从每个map task拉取分区数据的时候会进行再次合并、排序,按照自定义的reduce逻辑代码取处理。
3.最后就是Reduce过程了(聚合)。