大数据 Shuffle 原理与实践|青训营笔记

135 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的的第7天

1.Shuffle 过程

map 阶段处理的数据如何传递给 reduce 阶段,是 MapReduce 框架中最关键的一个流 程,这个流程就叫 shuffle

shuffle: 洗牌、发牌 ——(核心机制:数据分区,排序,分组,规约,合并等过程)
在这里插入图片描述

shuffle 是 Mapred uce 的核心,它分布在 Mapreduce 的 map 阶段和 reduce 阶段。一般 把从 Map 产生输出开始到 Reduce 取得数据作为输入之前的过程称作 shuffle。

  1. Collect阶段 :将 MapTask 的结果输出到默认大小为 100M 的环形缓冲区,保存的是 key/value,Partition 分区信息等。
  2. Spill阶段 :当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在 将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了 combiner,还会将 有相同分区号和 key 的数据进行排序。
  3. Merge阶段 :把所有溢出的临时文件进行一次合并操作,以确保一个 MapTask 最终只 产生一个中间数据文件。
  4. Copy阶段 :ReduceTask 启动 Fetcher 线程到已经完成 MapTask 的节点上复制一份 属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定 的阀值的时候,就会将数据写到磁盘之上。
  5. Merge阶段 :在 ReduceTask 远程复制数据的同时,会在后台开启两个线程对内存到 本地的数据文件进行合并操作。
  6. Sort阶段 :在对数据进行合并的同时,会进行排序操作,由于 MapTask 阶段已经对 数据进行了局部的排序,ReduceTask 只需保证 Copy 的数据的最终整体有效性即可。 Shuffle 中的缓冲区大小会影响到mapreduce 程序的执行效率,原则上说,缓冲区越 大,磁盘io的次数越少,执行速度就越快缓冲区的大小可以通过参数调整, 参数:mapreduce.task.io.sort.mb 默认10

2. Shuffle缓存流程:

在这里插入图片描述

----shuffle是MR处理流程中的一个过程,它的每一个处理步骤是分散在各个map task和reduce task节点上完成的,整体来看,分为3个操作:
1、分区partition
2、Sort根据key排序
3、Combiner进行局部value的合并
整个shuffle的大流程如下:

在这里插入图片描述

  • map task输出结果到一个内存缓存,并溢出为磁盘文件
  • combiner调用
  • 分区/排序
  • reduce task 拉取map输出文件中对应的分区数据
  • reduce端归并排序
    产生聚合values迭代器来传递给reduce方法,并把这组聚合kv(聚合的依据是GroupingComparator)中排序最前的kv的key传给reduce方法的入参 key