map方法之后,reduce方法之前的这段数据处理过程,叫做shuffle。
shuffle过程
- Map端通过先把数据写出getPartiton()方法,然后带着分区编号发送到环形缓冲区中。
- 环形缓冲区默认100M,数据达到80%时,溢写数据并反向写入索引和数据。此处可以进行一些优化,一般我们调整环形缓冲区的大小为200M,数据达到90%-95%时溢写,减少溢写次数。
- 数据溢写之前进行分区和快速排序。对key的索引按照字典顺序排序。
- 在归并前,可以根据业务选择,是否要对分区排序后的数据进行combiner合并数据。一般来说,不影响业务的情况下(求和操作,求平均值操作不可使用),我们使用combiner合并。
- merge归并分区排序后的数据。
- 归并后的数据还可以再进行combiner合并,然后压缩,存储到磁盘。
- Reduce端先将相同分区的数据加载到缓存中,如果缓存足够,直接merge归并数据;如果缓存不够,先将数据溢写到磁盘,再进行merge归并。
- 归并后的数据默认按照key进行分组,也可以自定义分组比较器自定义分组。
- 分组后的数据进入reduce方法中进行处理。