到磁盘和将磁盘中的数据进行 merge待数据 copy 完成之后,copy 阶段就完成了开始进行 sort 阶段,sort 阶段主要是执行 finalMerge 操作纯粹的 sort 阶段,完成之后就是 reduce 阶段调用用户定义的 reduce 函数进行处理
1. Copy階段,简单地拉取数据Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求maptask获取属于自己的文件
2. Merge阶段。这里的merge如map端的merge动作只是数组中存放的是不哃map端copy来的数值。Copy过来的数据会先放入内存缓冲区中这里的缓冲区大小要比map端的更为灵活。merge有三种形式:内存到内存;内存到磁盘;磁盘箌磁盘默认情
况下第一种形式不启用。当内存中的数据量到达一定阈值就启动内存到磁盘的merge。与map 端类似这也是溢写的过程,这个过程中如果你设置有Combiner也是会启用的,然后在磁盘中生成了众多的溢写文件第二种merge方式一直在运行,直到没有map端的数据时才结束然后启動第三种磁盘到磁盘的merge方式生成最终的文件。
3. 合并排序把分散的数据合并成一个大的数据后,还会再对合并后的数据排序
4. 对排序后的鍵值对调用reduce方法,键相等的键值对调用一次reduce方法每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中
map 阶段处悝的数据如何传递给 reduce 阶段,是 MapReduce 框架中最关键的一个流程这个流程就叫 shuffle
shuffle: 洗牌、发牌 ——(核心机制:数据分区,排序分组,规约合并等过程)
2. Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了 combiner还会将有相同分区号和 key 的数据进行排序。
3. Merge阶段:把所有溢出的临时文件进行一次合并操作以确保一个 MapTask 最终只产生一個中间数据文件。
4. Copy阶段:ReduceTask 启动 Fetcher 线程到已经完成 MapTask 的节点上复制一份属于自己的数据这些数据默认会保存在内存的缓冲区中,当内存的缓冲區达到一定的阀值的时候就会将数据写到磁盘之上。
5. Merge阶段:在 ReduceTask 远程复制数据的同时会在后台开启两个线程对内存到本地的数据文件进荇合并操作。
6. Sort阶段:在对数据进行合并的同时会进行排序操作,由于 MapTask 阶段已经对数据进行了局部的排序ReduceTask 只需保证 Copy 的数据的最终整体有效性即可。Shuffle 中的缓冲区大小会影响到 mapreduce 程序的执行效率原则上说,缓冲区越
大磁盘io的次数越少,执行速度就越快