对同一个apache Spark RDD的操作会导致所有语句重新执行

时间:2016-01-14 17:31:51

标签: scala apache-spark rdd

我正在使用Apache Spark处理大量数据。我需要在同一个RDD上执行许多Spark操作。我的代码如下所示:

val rdd = /* Get the rdd using the SparkContext */
val map1 = rdd.map(/* Some transformation */)
val map2 = map1.map(/* Some other transformation */)
map2.count
val map3 = map2.map(/* More transformation */)
map3.count

问题在于调用第二个操作map3.count会强制重新执行转换rdd.mapmap1.map

到底是怎么回事?我认为Spark构建的 DAG 可以应对这种行为。

1 个答案:

答案 0 :(得分:2)

这是预期的行为。除非可以从缓存中获取其中一个祖先(通常意味着在shuffle期间显式或隐式地持久化),每个操作都将重新计算整个谱系。

如果RDD已被持久化但数据已从缓存丢失/删除或可用空间量较低以存储所有记录,则也可以触发重新计算。

在这种特殊情况下,您应按以下顺序cache

...
val map2 = map1.map(/* Some other transformation */)
map2.cache
map2.count
val map3 = map2.map(/* More transformation */)
...

如果您想避免重复评估rddmap1map2