Hadoop shuffer阶段分为mapshuffer阶段,reduceshuffer阶段两个阶段
在理解之前需要知道shuffer是什么意思,mapreduce的任务流程,大家可以先理解一下再进一步学习下一阶段,图1、2是我在网上找了两个画的不错的mapreduce任务流程图帮助你们理解。
mapshuffer阶段:
这个阶段发生在map阶段之后(数据写入内存之前),数据在写入内存的过程就已经开始shuffer了,内存的大小是可以改变的,mapreduce.task.io.sort.mb的数值就是内存的大小,默认为100M。数据在写入内存大于80%时,会发生溢出(spill)过程,将数据整体移至磁盘,在移至磁盘partitions时会发生排序过程(combiner()),将数据按照排序的规则分布在分区中,然后进入mapshuffer最后一个阶段merge,这个过程将一个分区的所有数据进行排序合并成一个文件目录,以供reduce获取。
reduceshuffer阶段:
copy merge中的数据到reduce端,这过程中将同一个key的分组放在一起,通过sort()排序,让后聚合为一个文件,这个过程实在磁盘上实现的,接下来就是reduce阶段了
Spark shuffer
https://www.cnblogs.com/jcchoiling/p/6431969.html
区别在于hadoopshuffer是sort-based,spill内存大小是100M,saprk是hash-based(hash-based故名思义也就是在Shuffle的过程中写数据时不做排序操作,只是将数据根据Hash的结果,将各个Reduce分区的数据写到各自的磁盘文件中),内存大小是32K,Hadoop的shuffle过程是明显的几个阶段:map(),spill,merge,shuffle,sort,reduce()等,是按照流程顺次执行的,属于push类型;但是,Spark不一样,因为Spark的Shuffle过程是算子驱动的,具有懒执行的特点,属于pull类型。
图1
图2