Shuffle​map​​reduce​中间的数据调度过程,包括:​缓存​​分区​​排序​等。

Shuffle数据调度过程:


  1. ​map task​​​处理​​hdfs​​​文件,调用​​map()​​​方法,​​map task​​​的​​collect thread​​​将​​map()​​​方法结果放入​​环形缓冲区​​(​默认大小​​100M​​)
  2. 当环形缓冲区达到​​阈值(80%)​​,将会触发​​溢出​​​操作,​​split thread​​​线程会调用​​HashPartitioner​​​或者​​自定义的分区规则​​​,对缓冲区内容进行​​分区​​,区内文件内容有序
  3. 当环形缓冲区再次达到阈值,会再次触发溢出操作,重复步骤2
  4. ​map()​​​方法执行结束后,会生成一系列​​分区且区内有序​​​的溢出小文件。该溢出小文件不会直接交给​​reduce()​​​方法,会进行​​merge操作​​​,将溢出的小文件​​按分区​​​进行​​合并​​​,生成一个完整的​​分区且区内有序​​的大文件。
  5. 每个​​reduce task​​​会获取每个​​map task​​​阶段最终结果文件的​​指定分区​​文件内容,进行归并排序操作,按照​​key​​排序,生成一个​​聚合组​​。
  6. 每个​​聚合组​​​调用一次​​reduce()​​​方法,​​key​​​为这一聚合组的相同key,​​values​​是这一聚合组的所有value的迭代器。
  7. 生成最终结果文件。

Shuffle数据调度过程(​大图链接​):

MapReduce框架中的Shuffle机制_数据