Spark 中的 Shuffle 是分布式数据交换的核心流程,涉及多个组件的协同工作。为了深入理解其处理过程,我们可以从源码角度分析 Shuffle 的执行路径,分为 Shuffle Write 和 Shuffle Read 两个阶段。
1. Shuffle Write 阶段
Shuffle Write 的主要任务是将 Mapper 的数据按照分区规则(如 HashPartitioner)分割、排序并写入磁盘。
1.1 数据分区与序列化
-
入口方法:
Mapper 阶段的compute()
方法中调用了ShuffleDependency
的相关逻辑。val partition = partitioner.getPartition(key)
数据会根据
partitioner
(如HashPartitioner
或自定义分区器)计算目标分区。 -
序列化:
每条数据会通过serializerInstance.serialize()
进行序列化,将数据转换成字节流以便后续写入。