对同一个 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.map
和 map1.map
.
这到底是怎么回事?我认为由 Spark 构建的 DAG 是造成这种行为的原因。
这是预期的行为。除非可以从缓存中获取其中一个祖先(通常这意味着它在洗牌期间已被显式或隐式保留),否则每个动作都将重新计算整个谱系。
如果 RDD 已持久化但数据已丢失/从缓存中删除或可用量space太低无法存储所有记录,也可以触发重新计算。
在这种特殊情况下,您应该cache
按以下顺序
...
val map2 = map1.map(/* Some other transformation */)
map2.cache
map2.count
val map3 = map2.map(/* More transformation */)
...
如果您想避免重复计算 rdd
、map1
和 map2
。
我正在使用 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.map
和 map1.map
.
这到底是怎么回事?我认为由 Spark 构建的 DAG 是造成这种行为的原因。
这是预期的行为。除非可以从缓存中获取其中一个祖先(通常这意味着它在洗牌期间已被显式或隐式保留),否则每个动作都将重新计算整个谱系。
如果 RDD 已持久化但数据已丢失/从缓存中删除或可用量space太低无法存储所有记录,也可以触发重新计算。
在这种特殊情况下,您应该cache
按以下顺序
...
val map2 = map1.map(/* Some other transformation */)
map2.cache
map2.count
val map3 = map2.map(/* More transformation */)
...
如果您想避免重复计算 rdd
、map1
和 map2
。