map端的shuffle:
每个maptask的数据会进入环形缓冲区中,(默认100M,溢出比是80%),数据在写入时,会进行分区,往数据中添加一个分区属性,当数据写入到80%时,会启动一个溢写的线程,把内容写到磁盘的指定目录下的新建的一个溢出写文件,写磁盘前要经过partition、sort、Combiner。等最后记录写完,合并全部溢出写文件为一个分区且排序的文件。
reduc端的shuffle:
可以分为复制阶段、排序阶段、reduce阶段.
复制阶段:map输出文件位于运行map任务的tasktracker的本地磁盘上,reduce通过http的方式获取输出文件的分区,tasktracker为分区文件运行reduce任务,只要有一个map任务完成,reduce任务就开始复制输出。
排序阶段:更恰当的说法是合并阶段,因为排序是在map端进行的。这个阶段将合并map输出,维持其顺序排序,循环进行。
reduce阶段:对已排序输出中的每个键调用reduce函数,此阶段的输出直接写到输出文件系统,一般为hdfs