我正在学习火花并且对工作安排和随机依赖性有疑问。在这里,DAG找到了there:
正如我们在Stage 33
上看到的,我们有多项操作:groupBy
,join
,groupBy
,join
。问题是我不太明白为什么两个groupBy操作被置于同一个阶段?我认为groupBy
需要改组,我们DAGScheduler
应该将Stage 33
拆分为包含单个groupBy
和join
的两个阶段。
答案 0 :(得分:3)
这里的随机播放表示为阶段之间的界限:
一旦数据被洗牌,并且所有洗牌后的RDD使用相同的分区,最终join
是1-1依赖(如果所有部分都在同一个动作中执行,由于搭配它也是本地的)并且不会#39; t需要额外的洗牌阶段。
答案 1 :(得分:1)
Shuffling
是一个跨分区重新分配数据(也称为重新分区)的过程,这些过程可能会或可能不会导致跨JVM进程或甚至通过线路移动数据(在不同计算机上的执行程序之间)。
在你的情况下,在并行化步骤之间进行改组 - 第30,31,32阶段作为输入,最后阶段33作为成对目的地。
不惜一切代价避免洗牌。考虑利用现有分区或使用Broadcast
变量并尝试减少数据传输的方法。
有关Spark中的改组的更多信息,请阅读here。