剖析Spark Shuffle原理(图文详解)

Spark Shuffle


1.逻辑层面

剖析Spark Shuffle原理(图文详解)

从逻辑层面来看,Shuffle 是指数据从一个节点重新分布到其他节点的过程,主要发生在需要重新组织数据以完成某些操作时。

RDD血统




Shuffle 触发条件:

  • reduceByKeygroupByKeyjoin 等操作需要对数据进行分组或聚合,这时需要 Shuffle 操作来重新分配数据。
  • distinctrepartition 等操作也会导致 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 可以使用 snappylz4 等压缩算法来减少数据量。

Shuffle 操作的阶段:

  • Map阶段: 这个阶段是 Shuffle 的写入阶段,任务将数据从内存中写入到本地磁盘上的 Shuffle 文件中。每个任务会生成多个文件,这些文件按照分区进行组织。
  • Reduce阶段: 这个阶段是 Shuffle 的读取阶段,任务从本地磁盘上读取 Shuffle 文件中的数据,并在内存中合并这些数据以进行进一步的计算。

    数据排序:
  • Shuffle 过程中的数据通常会被排序,以便进行有效的分组和聚合操作。排序操作也会在磁盘上进行,并在任务执行时加载到内存中。

Spark执行出错

版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/74089.html