MapReduce的shuffle过程理解

首先了解什么是shuffle过程
简单的来说就是map的输出 作为reduce的输入的过程称为shuffle流程
MapReduce的shuffle过程理解

1、根据文件的切片个数启动相应的maptask任务
2、maptask任务 逐行读取 对应文件中的内容
3、将读取到的内容,标记好分区号后 输入到环形缓冲区中(环形缓冲区大小默认100m)
4、当环形缓冲区中的内容达到阈值(80%),将数据溢写到磁盘中
5、溢写之前 将数据进行排序,按照分区号(从大到小的顺序),相同区内按照key值进行排序,如果有combiner过程 执行combiner后,写到磁盘上。
(combiner 优化方式之一 使输出结果更加紧凑 减少写到磁盘的数据和传递给reduce的数据,简单的来说combiner就是一个数据合并的过程)
6、最后将 相同分区的数据 合并到一个文件中 并按照 key值进行排序,如果溢写的文件大于三个 而且有combiner过程 则在输出文件写到磁盘之前 再次执行combiner

MapReduce的shuffle过程理解

1、reduce任务获取map任务的分区文件(远程拷贝),当一个map任务完成就开始复制,而不是等所有map任务全部完成 才开始
2、Map输出很小时会被复制到reduce任务中的内存中(内存大小为jvm堆内存的百分之70),反之,map输出直接复制到磁盘中
3、当数据内容占到reduce内存的百分之66或者达到1000条数据时 将内存中的数据合并,按照key值排序以后(如果有combiner过程则在其执行完后再溢写到磁盘中)溢写到磁盘中
4、当磁盘中副本数过多时,后台线程会将他们合并为 更大的 排好序的文件 为最后的合并减少一些时间
5、复制完所有的map输出后,进入排序(合并)阶段,合并因子默认为10,每次合并10个文件 最后合并为一个文件,按照key值排好序后 提交给reduce

怎样才能在最后合并为一个文件呢?
Hadoop权威指南上提了这么一个例子
一共有40个文件
先预计算合并4个文件 1
第一趟合并10个文件 1
第二趟合并10个文件 1
第三趟合并10个文件 1
现在文件中的个数正好为10个文件40-4-10-10-10+4=10
第四趟合并10个 文件 1
这样 就把40 个 文件 合并为了最后1个文件

同理 如果有50个文件 合并因子为10 合并5次 那么预先合并 5个文件

自己学习中的理解,如果有错 希望指正