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>>
整个流程的图片参考
PS:以下图片来自卡弗卡大数据,侵删