2017-08-31 69 views
2

我正在学习火花并对作业调度和洗牌依存关系有疑问。在这里,DAG,我发现there理解火花中的洗牌

enter image description here

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

回答

3

搅乱此处阶段之间表示为界限:

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

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

1

Shuffling是跨分区(又称重新分区)重新分配数据的过程,这些分区可能会导致跨越JVM进程或甚至通过线路(在独立机器上的执行者之间)移动数据。

在你的情况下,在并行化步骤之间进行混洗 - 阶段30,31,32作为输入,最终阶段33作为目标成对。

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