【问题标题】:Understanding shuffle in spark了解火花中的洗牌
【发布时间】:2017-09-01 17:35:11
【问题描述】:
我正在学习 spark 并且有一个关于作业调度和洗牌依赖的问题。这里是我找到的 DAG there:
正如我们在Stage 33 上看到的,我们有多个操作:groupBy、join、groupBy、join。问题是我不太明白为什么将两个 groupBy 操作放在同一个阶段?我认为groupBy 需要改组,我们DAGScheduler 应该将Stage 33 拆分为包含单个groupBy 和join 的两个阶段。
【问题讨论】:
标签:
java
scala
apache-spark
【解决方案1】:
这里的随机播放表示为阶段之间的边界:
- 第 30 阶段 - 第 33 阶段
- 第 31 阶段 - 第 33 阶段
- 第 32 阶段 - 第 33 阶段
一旦数据被洗牌,并且所有洗牌的RDD使用相同的分区器,最终join是1-1依赖(如果所有部分都在同一个动作中执行,由于搭配也是本地的)并且不会需要额外的随机播放阶段。
【解决方案2】:
Shuffling 是跨分区重新分配数据的过程(也称为重新分区),它可能会也可能不会导致跨 JVM 进程甚至通过网络(不同机器上的执行程序之间)移动数据。
在您的情况下,并行化步骤之间发生改组 - 阶段 30、31、32 作为输入,最终阶段 33 作为目标。
不惜一切代价避免洗牌。考虑利用现有分区的方法,或使用Broadcast 变量并尝试减少数据传输。
更多关于 Spark 中洗牌的信息,您可以阅读here。