剖析Spark Shuffle原理(图文详解)
Spark Shuffle
1.逻辑层面
从逻辑层面来看,Shuffle 是指数据从一个节点重新分布到其他节点的过程,主要发生在需要重新组织数据以完成某些操作时。
RDD血统
Shuffle 触发条件:
reduceByKey
、groupByKey
、join
等操作需要对数据进行分组或聚合,这时需要 Shuffle 操作来重新分配数据。distinct
和repartition
等操作也会导致 Shuffle,因为它们需要改变数据的分布方式。
Shuffle 过程:
- Shuffle Read:从之前的任务中读取数据。
- Shuffle Write:将数据写入到磁盘上,以便后续的任务可以读取这些数据。
Shuffle 操作的逻辑流程:
- Stage 分割: Spark 将任务划分为多个 Stage,每个 Stage 包含多个 Task。
- Shuffle 依赖: 一个 Stage 的输出作为下一个 Stage 的输入,这个过程需要 Shuffle 来完成。
2.物理层面
从物理层面来看,Shuffle 涉及到数据在集群中的实际传输和存储过程。
Shuffle 文件存储:
- Shuffle 操作会将数据写入到磁盘上的临时文件中。这些文件通常存储在每个工作节点的本地磁盘上,用于在不同的任务之间传递数据。
- 在 Spark 的默认配置下,这些文件会被存储在
/shuffle
目录下,但可以通过配置参数更改。
Shuffle 数据传输: - 网络传输: 在 Shuffle 操作中,数据需要从源节点传输到目标节点,这通常是通过网络完成的。这种传输会引入一定的网络开销,可能影响作业的整体性能。
- 数据压缩: 为了减少网络传输的开销,Spark 支持在 Shuffle 过程中对数据进行压缩。Spark 可以使用
snappy
、lz4
等压缩算法来减少数据量。
Shuffle 操作的阶段:
- Map阶段: 这个阶段是 Shuffle 的写入阶段,任务将数据从内存中写入到本地磁盘上的 Shuffle 文件中。每个任务会生成多个文件,这些文件按照分区进行组织。
- Reduce阶段: 这个阶段是 Shuffle 的读取阶段,任务从本地磁盘上读取 Shuffle 文件中的数据,并在内存中合并这些数据以进行进一步的计算。
数据排序: - Shuffle 过程中的数据通常会被排序,以便进行有效的分组和聚合操作。排序操作也会在磁盘上进行,并在任务执行时加载到内存中。
Spark执行出错