Spark'Dataset的行为不正常

T. *_*ęda 10 apache-spark apache-spark-sql

最近我看到了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
Run Code Online (Sandbox Code Playgroud)

但是当我调用data.unpersist()ie时(1),Spark会从存储中删除所有数据集,也就是extension数据集,它不是我试图取消的数据集.

这是预期的行为吗?如何unpersist在不使用"链接下一个"的所有数据集的情况下,通过旧数据集释放一些内存?

我的设置:

  • Spark版本:当前主人,RC为2.3
  • 斯卡拉:2.11
  • Java:OpenJDK 1.8

问题看起来类似于理解Spark的缓存,但在这里我在unpersist之前做了一些动作.起初我计算所有内容然后保存到存储中 - 我不知道缓存在RDD中是否与数据集中的相同

Avi*_*rya 10

这是火花缓存的预期行为.Spark不希望保留无效的缓存数据.它完全删除所有缓存的计划引用数据集.

这是为了确保查询正确.在该示例中,您dataset将从缓存的数据集创建扩展data.现在,如果数据集data未被存在,则扩展数据集本身不再依赖于缓存的数据集data.

是他们所做修复的Pull请求.你可以看到类似的JIRA


T. *_*ęda 5

Spark 2.4 的答案:

有一张关于数据集和缓存行为正确性的票,请参阅https://issues.apache.org/jira/browse/SPARK-24596

根据 Maryann Xue 的描述,现在缓存将按以下方式工作:

  1. 删除表和常规(持久)视图:常规模式
  2. 删除临时视图:非级联模式
  3. 修改表内容(INSERT/UPDATE/MERGE/DELETE):常规模式
  4. 调用 DataSet.unpersist():非级联模式
  5. 调用Catalog.uncacheTable():遵循与删除表/视图相同的约定,即临时视图使用非级联模式,其余使用常规模式

其中“常规模式”是指问题中的 mdoe,@Avishek 的回答和非级联模式意味着,这extension不会是不持久的