在使用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将同时具有保存操作吗?
答案 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中的一个概念,一个动作调用一个作业,因此无法在哪个阶段包含两个动作。