MapReduce的Shuffle过程

整个MapReduce的运行过程

input --> map --> shuffle -->reduce --->output

以wordcount数据模型为例

Map的输出数据模式如下:<hadoop,1><spark,1>以<key,value>对的形式存在

因为map阶段是对整个文件中的每一个元素进行处理,对于Map的输出量是很大的。

Shuffle阶段

1>Map的数据会写入到内存(环形缓冲区:默认大小:100m),当数据达到缓冲区总容量的80%(阈值)的时候,会将数据spill到本地磁盘

  • 分区(partitioner)分区决定map输出的数据将会被哪个reduce任务进行处理。
    因为分区的数目对应了reduce的数量
  • 排序  
    对分区中的数据排序
  • spill写到本地磁盘
    将内存中的数据写入到本地磁盘(hadoop.tmp.dir对应的目录)

2>当Map阶段数据处理完成之后,会将spill到磁盘的数据进行合并

在1中提到,每次数据达到缓冲区容量的阈值时,会将数据spilll到磁盘,此时会在该目录下产生很多小文件

  • 将各个分区的数据合并到一起
  • 分区合并后再次排序

3>当map阶段数据处理完成之后,各个reduce任务主动到已经完成的map任务的本地磁盘中去拉去属于自己要处理的数据,最后形成一个文件

  • reduce对应partition写入到内存,根据reduce端数据内存的阈值,spill到reduce本地磁盘中,形成一个个小文件
  • 对文件进行合并 
  • 排序
  • 分组,将相同key的value放在一起
    <hadoop,1>
    <hadoop,1>  --><hadoop,List<1,1,1>>
    <hadoop,1>

 

Reduce阶段的数据模型是<hadoop,List<1,1,1>>

 

整个流程的图片参考
MapReduce的Shuffle过程

PS:以下图片来自卡弗卡大数据,侵删

MapReduce的Shuffle过程