一、Shuffle的核心定义与作用
Shuffle 是Spark中跨节点数据重分区的过程,通常由宽依赖操作(如groupByKey
、join
)触发。其核心目的是将相同Key的数据分发到同一个节点,以便进行聚合或连接操作。
-
重要性:
- 数据分区:确保后续计算(如Reduce阶段)能按Key正确处理数据。
- 性能瓶颈:涉及大量磁盘I/O、网络传输及序列化,是Spark作业优化的关键点。
- Stage划分依据:Shuffle操作将DAG切分为多个Stage,上游为Map阶段,下游为Reduce阶段。
二、Shuffle的核心流程
1. Shuffle Write(Map端处理)
-
分区与排序:
Map任务根据Key的哈希值或范围将数据划分为多个分区,每个分区对应下游的一个Reduce任务。数据在内存中排序后写入本地磁盘。 -
文件生成:
- Hash Shuffle:每个Map任务为每个Reduce任务生成独立文件,导致文件数爆炸