MapReduce Shuffle过程详解
请详细描述MapReduce中Shuffle阶段的工作机制,包括Map端Shuffle和Reduce端Shuffle的各个步骤。
回答
专业代码师
Shuffle定义: MapReduce中Map输出到Reduce输入之间的数据拉取、排序、合并过程,是MapReduce最核心的阶段。
一、Map端Shuffle(Map Side):
- 环形缓冲区(Ring Buffer): Map输出写入内存中的环形缓冲区(默认100MB),达到80%阈值时开始溢出写入(Spill)
- 分区(Partition): 每个Map输出根据Partitioner(默认HashPartitioner)分到对应分区
- 排序(Sort): 在分区内按Key进行排序(默认字典序,可自定义Comparator)
- 合并(Combine/可选): 可选在Map端进行局部聚合,减少传输数据量
- 溢出文件: 多次Spill产生多个小文件,全部Spill完成后合并(Merge) 成一个有序的大文件
- 索引: 为每个分区建立索引,方便Reduce拉取
二、Reduce端Shuffle(Reduce Side):
- 拉取(Fetch): Reduce Task启动后从各个Map Task的完成节点并行拉取属于自己的分区数据
- 合并(Merge): 对拉取到的多个Map输出文件进行归并排序(Merge Sort)
- Reduce输入: 合并为一个大文件后,按Key分组,每组调用一次
reduce()函数
关键参数:
mapreduce.task.io.sort.mb:环形缓冲区大小mapreduce.map.sort.spill.percent:溢写阈值mapreduce.reduce.shuffle.parallelcopies:并行拉取线程数