了解火花中的DAG

时间:2017-08-31 20:15:42

标签: java scala apache-spark

问题是我有以下DAG:

enter image description here

我认为当需要洗牌时,火花会在不同阶段分配工作。考虑阶段0和阶段1.有一些操作不需要改组。那么为什么Spark将它们分成不同的阶段呢?

我认为跨分区的实际数据移动应该发生在第2阶段。因为我们需要cogroup。但对于cogroup,我们需要来自stage 0stage 1的数据。

所以Spark保留了这些阶段的中间结果,然后将其应用于Stage 2

1 个答案:

答案 0 :(得分:4)

你应该想到一个单一的阶段"作为一系列转换,可以在每个RDD的分区上执行,而无需访问其他分区中的数据;

换句话说,如果我可以创建一个接受单个分区并生成一个新(单个)分区的操作T,并将相同的T应用于每个RDD的分区--T可以由一个单一的阶段"。

现在,stage 0stage 1操作两个单独的RDD 并执行不同的转换,因此他们无法共享阶段。请注意,这些阶段都不会对另一个阶段的输出进行操作 - 因此它们不是"候选者"用于创建单个阶段。

注意,这并不意味着他们无法并行运行 :Spark可以安排两个阶段同时运行;在这种情况下,stage 2(执行cogroup)将等待stage 0stage 1完成,生成新分区,将它们混合到正确的执行程序,然后在这些新分区上运行。