开局一张图
1.什么是Shuffle?
Shuffle,是指对Map输出结果进行分区、排序、合并等处理并交给Reduce 的过程。分为Map端的操作和Reduce端的操作。
2.Shuffle过程
1.Map端的Shuffle
Map的输出结果首先被缓存到内存,当缓存区容量达到80%(缓冲区默认100MB),就启动溢写操作。当启动溢写操作时,首先需要把缓存中的数据进行分区,然后对每个分区的数据进行排序和合并(combine),之后再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,磁盘中就会生成多个溢写文件。在Map任务全部结束前,这些溢写文件会被归并成一个大的磁盘文件,然后通知相应的Reduce任务来领取属于自己处理的数据。
2.在Reduce端的Shuffle过程
Reduce任务从Map端的不同Map机器领回属于自己处理的那部分数据,然后对数据进行合并,排序之后交给Reduce处理。‘
3.Shuffle的作用
- 保证每一个Reduce任务处理的数据大致是一致的。
- Map任务输出的key相同,一定是相同分区,并且肯定是相同的Reduce处理保证计算结果的准确性。
- Reduce任务的数量决定了分区的数量,Reduce任务越多计算处理的并行度也就越高。
Reduce任务的数量(默认为1)可以通过: job.setNumReduceTasks(数量)
4.Shuffle的特点
- Map端溢写时,key相同的一定是在相同的分区。
- Map端溢写时,排序减少了Reduce的全局排序的复杂度。
- Map端溢写时,合并(combiner【可选】减少溢写文件的体积,提高了Reduce任务在Fetch数据时的效率,它是一种MapReduce优化策略。
- Reduce端计算或输出时,它的数据都是有序的。