理解Spark中的shuffle

3
我正在学习Spark,并且关于作业调度和shuffle依赖有一个问题。这是我找到的DAG 链接在此

enter image description here

如我们所见,在阶段33中,我们有多个操作:groupByjoingroupByjoin。问题是,我不太明白为什么两个groupBy操作被放入同一阶段?我认为groupBy需要shuffle,因此DAGScheduler应将Stage 33拆分成包含单个groupByjoin的2个阶段。

2个回答

4

在这里,洗牌表示阶段之间的边界:

  • 第30阶段 - 第33阶段
  • 第31阶段 - 第33阶段
  • 第32阶段 - 第33阶段

一旦数据被洗牌,并且所有洗牌后的RDD使用相同的分区器进行最终join,它就具有1-1的依赖关系(如果所有部分在同一个动作中执行,由于合并,它也是本地化的),不需要额外的洗牌阶段。


1

Shuffling 是重新分配数据到不同分区(也称为重分区)的过程,可能导致数据移动到不同的 JVM 进程甚至通过网络在不同的执行器之间传输。

在您的情况下,Shuffling 在并行化步骤之间发生 - 阶段 30、31、32 作为输入,最终阶段 33 作为目的地成对发生。

尽量避免 Shuffling。考虑利用现有的分区或使用 Broadcast 变量,并尝试减少数据传输。更多关于 Spark 中的 Shuffling 的信息请参阅 这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接