概述
Shuffle,即混洗、洗牌,顾名思义就是对数据打乱重新分配。Shuffle发生在Map输出至Reduce的输入过程之间。主要分为两部分
- Map任务输出的数据进行分组、合并、排序,并写入本地磁盘
- Reduce任务拉取数据进行合并、排序
Shuffle过程
Map端
- Map端输出时,会先将数据写入内存的环形缓冲区,默认大小100M,可通过参数设置
- 当缓冲区的内容大小达到阈值(默认0.8,可通过参数设置),便有一个后台线程将写入缓冲区的数据溢写到磁盘。溢写的过程中Map任务仍然可以写数据到缓冲区,一旦缓冲区写满,Map任务将会被阻塞,知道后台线程写磁盘结束
- 数据溢写到磁盘时会计算输出key的分区,同一个分区的key分在一组并按照key排序,最后写入磁盘文件。如果设置了combiner,会在写磁盘前调用combiner函数进行聚合,目的是减少网络IO,且不会影响Reduce计算结果
- 每一次溢写都会产生一个文件,Map结束后会产生多个文件,但最终会被合并成一个分区且有序的文件。合并文件时可通过参数设置合并的文件个数
- 输出到磁盘的过程可以设