Data Shuffling in Spark
Spark action 算子触发 Spark 作业执行,一个作业 job 包含若干阶段 stage,而 Spark 划分 stage 的依据是 transformation 算子之间是否存在宽依赖(wide dependencies),即以 shuffle 操作来划分 stage,一个 stage 会尽可能地包含更多窄依赖 transformations。
Shuffle 是 Spark 用于跨 JVM (executor) 甚至跨机器(不同节点上的 executor 或 driver)的数据重分发机制。需要注意的是,Spark Shuffle 是一个昂贵的操作,因为它通常包含以下开销:
- 磁盘 I/O
- 涉及数据序列化与反序列化
- 网络 I/O
因此,为了提高 Spark 开发应用的性能,我们应尽可能地避免 shuffle。