理解火花中的洗牌

时间:2017-08-31 10:36:36

标签: java scala apache-spark

我正在学习火花并且对工作安排和随机依赖性有疑问。在这里,DAG找到了there

enter image description here

正如我们在Stage 33上看到的,我们有多项操作:groupByjoingroupByjoin。问题是我不太明白为什么两个groupBy操作被置于同一个阶段?我认为groupBy需要改组,我们DAGScheduler应该将Stage 33拆分为包含单个groupByjoin的两个阶段。

2 个答案:

答案 0 :(得分:3)

这里的随机播放表示为阶段之间的界限:

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

一旦数据被洗牌,并且所有洗牌后的RDD使用相同的分区,最终join是1-1依赖(如果所有部分都在同一个动作中执行,由于搭配它也是本地的)并且不会#39; t需要额外的洗牌阶段。

答案 1 :(得分:1)

Shuffling是一个跨分区重新分配数据(也称为重新分区)的过程,这些过程可能会或可能不会导致跨JVM进程或甚至通过线路移动数据(在不同计算机上的执行程序之间)。

在你的情况下,在并行化步骤之间进行改组 - 第30,31,32阶段作为输入,最后阶段33作为成对目的地。

不惜一切代价避免洗牌。考虑利用现有分区或使用Broadcast变量并尝试减少数据传输的方法。 有关Spark中的改组的更多信息,请阅读here