概念
Shuffle中译为“洗牌”,map阶段的输出经过shuffle(分区、排序、合并)后形成一定有规则的数据,按照分区分配给对应的reduce,它描述着数据从map阶段流入reduce阶段的过程。
Shuffle过程
从图中可以看出,map到reduce之间就是shuflle处理数据的全过程。总共分为两个阶段,map阶段的shuflle和reduce阶段的shuffle,整体流程如下:
1、map结果写入环形内存缓冲区,当内存不足以存储所有数据时,将数据批量溢写到磁盘。为了尽量减少IO消耗,所以在数据写入磁盘之前会先写入缓冲区,待缓冲区达到阈值后才批量将数据写入磁盘
2、partition分区。在数据写入磁盘之前会先进行分区,一个分区对应一个reducer,期望数据在多个reducer之间达到均衡
3、排序(sort)和合并(combine)。数据经过分区之后,先按照key进行排序,如果用户指定了Combiner,再进行combine操作
4、溢写(spill)。经过排序和合并之后的数据会写入磁盘文件,每次spill都会产生一个文件。一个分区上的文件也叫一个segment
5、归并(merge)。一个map最终会生成一个磁盘文件,由于多次spill会产生多个文件,所以需要将这些文件进行merge,最终形成一个有序的大文件。merge过程中有可能遇到相同key的数据,如果用户设置了Combiner,会执行combine操作
以上1-5是map阶段的shuffle,以下是reduce阶段的shuffle步骤
6、拷贝(copy)。当某个map完成后,reduce不断拉取map生成的文件到ruduce。和map阶段一样先将数据写入环形内存缓冲区,当达到阈值时,将数据批量溢写到磁盘
7、排序(sort)和归并(merge)。sort是伴随copy动作时执行的,由于map的输出是有序的,所以copy是进行sort消耗很低。当溢写数据到磁盘之前,如果用户设置了Combiner会先进行combine,然后将数据写入磁盘文件。当接受完map数据会生成多个溢写磁盘文件,将这些文件归并merge,合并成一个有序的大文件
map阶段shuffle详细过程
map阶段shuffle过程就是将map结果进行