java - 了解 spark 中的 DAG

标签 java scala apache-spark

问题是我有以下 DAG:

enter image description here

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

我认为跨分区的实际数据移动应该发生在第 2 阶段。因为这里我们需要cogroup。但是要进行联合分组,我们需要来自 stage 0stage 1 的数据。

那么 Spark 会保留这些阶段的中间结果,然后将其应用到 Stage 2 上吗?

最佳答案

您应该将单个“阶段”视为一系列转换,可以在 RDD 的每个分区上执行,而无需访问其他分区中的数据;

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

现在,stage 0stage 1两个独立的 RDDs 上运行并执行不同的转换,所以它们不能同台。请注意,这两个阶段都不对另一个阶段的输出进行操作 - 因此它们不是创建单个阶段的“候选对象”。

注意这并不意味着它们不能并行:Spark 可以安排两个阶段同时运行;在这种情况下,stage 2(执行 cogroup)将等待 stage 0stage 1 到完成,产生新的分区,将它们洗牌给正确的执行者,然后对这些新分区进行操作。

关于java - 了解 spark 中的 DAG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45989409/

相关文章:

apache-spark - Spark 在使用 Docker Mesos 集群进行身份验证时挂起

java - Mac OS 上安装 Java 的所有位置之间有何区别?

java - Spark 独立

python - Spark 在 Scala 中打印 DataFrame 的形状

scala - 带有可变参数的Spark UDF

bash - ssh 函数上的 bash 脚本中的意外行为

java - 米娜和 Websocket

减少数据库负载的 Java 内存存储 - 安全吗?

java - Hibernate @PostLoad 永远不会被调用

scala - 如何使用 saveAsTextFile 在 spark 数据框中进行自定义分区