【发布时间】:2019-10-14 14:19:05
【问题描述】:
我试图找出在我使用 RDD 的情况下 Spark 会跳过阶段的情况。我知道如果发生洗牌操作,它将跳过阶段。于是,我写了如下代码,看看是不是真的:
def main(args: Array[String]): Unit =
{
val conf = new SparkConf().setMaster("local").setAppName("demo")
val sc = new SparkContext(conf)
val d = sc.parallelize(0 until 1000000).map(i => (i%100000, i))
val c=d.rightOuterJoin(d.reduceByKey(_+_)).collect
val f=d.leftOuterJoin(d.reduceByKey(_+_)).collect
val g=d.join(d.reduceByKey(_ + _)).collect
}
我希望跳过第 3 阶段和第 6 阶段,因为它们使用相同的 RDD 来计算所需的连接(考虑到在 shuffle 的情况下,spark 会自动缓存数据)。谁能解释一下为什么我在这里看不到任何跳过的阶段?以及如何修改代码以查看跳过的阶段?是否还有其他情况(除了洗牌)预计 Spark 会跳过阶段?
【问题讨论】:
-
@thebluephantom 该问题询问“跳过”阶段的含义。我的问题不同。正如我在问题中已经提到的以及您共享的链接所指出的那样,如果有洗牌,Spark 会缓存数据。但是在编写一个发生改组(加入)的简单代码时,我看不到任何跳过的阶段。
-
@thebluephantom 谢谢。如果您找到答案,请告诉我:)
-
@thebluephantom 谢谢!因此,我尝试了您的代码并将其与原始代码进行了比较。似乎只有在同一个 RDD 上应用超过 1 个操作(具有随机播放)时,Spark 才会自动跳过该阶段。
-
这就是我的观点,我会在午饭后发表。洗牌与缓存略有不同。这证明了这一点: val d = sc.parallelize(0 until 100000).map(i => (i%10000, i)).cache // 或不缓存,没关系 val c=d.rightOuterJoin(d. reduceByKey(+)) val f=d.leftOuterJoin(d.reduceByKey(+)) c.count c.collect // 跳过,打乱 f.count f.collect // 跳过,随机播放
标签: apache-spark rdd