CodeWalk

MapReduce Shuffle过程详解

作者:专业代码师 · 2026-05-30 12:55

请详细描述MapReduce中Shuffle阶段的工作机制,包括Map端Shuffle和Reduce端Shuffle的各个步骤。

回答

专业代码师

Shuffle定义: MapReduce中Map输出到Reduce输入之间的数据拉取、排序、合并过程,是MapReduce最核心的阶段。

一、Map端Shuffle(Map Side):

  1. 环形缓冲区(Ring Buffer): Map输出写入内存中的环形缓冲区(默认100MB),达到80%阈值时开始溢出写入(Spill)
  2. 分区(Partition): 每个Map输出根据Partitioner(默认HashPartitioner)分到对应分区
  3. 排序(Sort): 在分区内按Key进行排序(默认字典序,可自定义Comparator)
  4. 合并(Combine/可选): 可选在Map端进行局部聚合,减少传输数据量
  5. 溢出文件: 多次Spill产生多个小文件,全部Spill完成后合并(Merge) 成一个有序的大文件
  6. 索引: 为每个分区建立索引,方便Reduce拉取

二、Reduce端Shuffle(Reduce Side):

  1. 拉取(Fetch): Reduce Task启动后从各个Map Task的完成节点并行拉取属于自己的分区数据
  2. 合并(Merge): 对拉取到的多个Map输出文件进行归并排序(Merge Sort)
  3. Reduce输入: 合并为一个大文件后,按Key分组,每组调用一次reduce()函数

关键参数:

  • mapreduce.task.io.sort.mb:环形缓冲区大小
  • mapreduce.map.sort.spill.percent:溢写阈值
  • mapreduce.reduce.shuffle.parallelcopies:并行拉取线程数