最近我看到了Spark的一些奇怪行为。
我的应用程序中有一个管道,我在其中操作一个大数据集 - 伪代码:
val data = spark.read (...)
data.join(df1, "key") //etc, more transformations
data.cache(); // used to not recalculate data after save
data.write.parquet() // some save
val extension = data.join (..) // more transformations - joins, selects, etc.
extension.cache(); // again, cache to not double calculations
extension.count();
// (1)
extension.write.csv() // some other save
extension.groupBy("key").agg(some aggregations) //
extension.write.parquet() // other save, without cache it will trigger recomputation of whole dataset
但是当我调用data.unpersist()
即(1)
时,Spark会从存储中删除所有数据集,也会删除{I}}数据集,而不是我试图取消的数据集。
这是预期的行为吗?如何在旧数据集上通过extension
释放一些内存,而不会在链#34中显示"接下来的所有数据集?
我的设置:
问题看起来类似于Understanding Spark's caching,但是我在这里做了一些在unpersist之前做的事情。起初我计算所有内容然后保存到存储中 - 我不知道缓存在RDD中是否与数据集中的相同
答案 0 :(得分:10)
这是火花缓存的预期行为。 Spark不希望保留无效的缓存数据。它完全删除所有缓存的计划,引用数据集。
这是为了确保查询正确。在示例中,您将从缓存的数据集dataset
创建扩展data
。现在,如果数据集data
未加载,则扩展数据集不再依赖于缓存的数据集data
。
答案 1 :(得分:2)
Spark 2.4的答案:
关于数据集的正确性和缓存行为,有一张票证,请参阅https://issues.apache.org/jira/browse/SPARK-24596
根据Maryann Xue的描述,现在缓存将以以下方式工作:
“常规模式”表示来自问题的答案,@ Avishek的答案以及非级联模式表示extension
不会持久存在