hadoop shuffle

73 阅读1分钟

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 函数进行处理。