Spark DAG阶段数

时间:2016-12-22 20:58:28

标签: apache-spark rdd

在使用spark RDD时,我知道每次有ShuffleRDD时都会创建一个新舞台,但是当我们有多个动作时会创建一个新舞台吗?

示例:

val rdd1 = sc.textFile("<some_path").keyBy(x=>x.split(",")(1))

val rdd2 = sc.textFile("<some_path").keyBy(x=>x.split(",")(1))

val rdd3 = rdd1.join(rdd2)

rdd3.filter(x=><somecondition1>).saveAsTextFile("location1")
rdd3.filter(x=><somecondition2>).saveAsTextFile("location2")

现在Stage1将有与rdd1,rdd2和rdd3相关的任务,那么Stage2将同时具有保存操作吗?

2 个答案:

答案 0 :(得分:0)

几个月前我实际上问了一个类似的问题here

在您的情况下,rdd3调用转换。因此,当您声明rdd3时,将发生创建rdd1和rdd2的操作。后续转换发生在每次保存(特别是过滤),但rdd1和rdd2不会再次作为操作运行。

如果在运行保存之前缓存数据,则会产生类似的效果。

我不知道您使用的是哪个版本的Spark,但您可以从文档here中找到相关信息。至少1.6+是相同的。

答案 1 :(得分:0)

Stage2只有一个保存操作。

在你的代码中saveAsTextFile是一个动作,它会调用spark来计算你的rdd血统。换句话说,spark只会在找到saveAsTextFile之前执行此代码。然后将创建阶段和任务并将其提交给执行者。

由于您的代码有两个saveAsTextFile并且您从未缓存过任何中间rdds,因此在这种情况下,rdd1,rdd2,rdd3将被计算两次。

Stage是Job中的一个概念,一个动作调用一个作业,因此无法在哪个阶段包含两个动作。