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

Actions on the same apache Spark RDD cause all statements re-execution

我正在使用 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 是造成这种行为的原因。

这是预期的行为。除非可以从缓存中获取其中一个祖先(通常这意味着它在洗牌期间已被显式或隐式保留),否则每个动作都将重新计算整个谱系。

如果 RDD 已持久化但数据已丢失/从缓存中删除或可用量space太低无法存储所有记录,也可以触发重新计算。

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

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

如果您想避免重复计算 rddmap1map2