Map 端 Shuffle:Map Output 生成
1. 环形缓冲区(Memory Buffer)
-
Map 的输出(key-value)先写入一个 内存缓冲区(默认 100MB)。
-
缓冲区满(或 Map 任务结束)时触发 spill 到磁盘。
2. Spill 过程(写磁盘)
-
会进行:
- Partition:根据 partitioner(如 hash)决定 key 属于哪个 reducer。
- Sort:每个分区内按 key 排序(必要:后续合并 & reduce)。
- Combiner(可选):对相同 key 局部聚合,减少网络传输。
- sort: 在这个过程中,会有一次快速排序。
-
Spill 会生成若干个中间临时文件。
3. Merge(合并中间文件)
- 若有多个 spill 文件(磁盘中间文件),Map 结束前进行合并(merge) 。
- 合并后的 Map 输出为 若干分区的文件块(一个 partition 对应一个 reducer)。
🌐 Reduce 端 Shuffle:数据拉取 & 合并
4. Reduce Fetch:拉取 Map 输出数据
-
每个 Reduce Task 知道哪些 Map Task 有它负责的 partition。
-
Reduce Task 启动后通过 HTTP 向每个 Map 节点拉取数据块。
-
并发拉取,写入本地磁盘。
5. Reduce Merge & Sort
-
拉取来的数据:可能来自不同的 Map、同一 reducer 的 partition。
-
Reduce 会:
-
对所有 Map 输出进行 归并排序(merge-sort) 。
-
保证 相同 key 在一起、顺序一致。
-
6. Grouping(按 key 分组)
- 排序后,Reducer 按 key 分组,送给 reduce 函数进行处理。