问题是我有以下 DAG:
我认为当需要改组时,spark 会在不同阶段分配工作。考虑 Stage 0 和 Stage 1。有些操作不需要洗牌。那么为什么 Spark 将它们分成不同的阶段呢?
我认为跨分区的实际数据移动应该发生在第 2 阶段。因为这里我们需要cogroup
。但是要进行联合分组,我们需要来自 stage 0
和 stage 1
的数据。
那么 Spark 会保留这些阶段的中间结果,然后将其应用到 Stage 2
上吗?
最佳答案
您应该将单个“阶段”视为一系列转换,可以在 RDD 的每个分区上执行,而无需访问其他分区中的数据;
换句话说,如果我可以创建一个接受单个分区并生成一个新(单个)分区的操作 T,并将相同的 T 应用于 RDD 的每个分区 - T 可以由单个“阶段”执行".
现在,stage 0
和 stage 1
在两个独立的 RDDs 上运行并执行不同的转换,所以它们不能同台。请注意,这两个阶段都不对另一个阶段的输出进行操作 - 因此它们不是创建单个阶段的“候选对象”。
注意这并不意味着它们不能并行:Spark 可以安排两个阶段同时运行;在这种情况下,stage 2
(执行 cogroup
)将等待 stage 0
和 stage 1
到完成,产生新的分区,将它们洗牌给正确的执行者,然后对这些新分区进行操作。
关于java - 了解 spark 中的 DAG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45989409/