Spark' 数据集不持久行为



最近我看到了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 会从存储中删除所有数据集,以及不是我试图取消保留的数据集的extension数据集。

这是预期的行为吗?如何通过在旧数据集上unpersist释放一些内存,而无需取消保留"链中的下一个"数据集?

我的设置:

  • 火花版:当前主站,RC 2.3
  • 斯卡拉:2.11
  • Java:OpenJDK 1.8

问题看起来类似于理解 Spark 的缓存,但在这里我正在取消持久之前执行一些操作。起初我计算所有内容,然后保存到存储中 - 我不知道缓存在 RDD 中的工作方式是否与数据集中相同

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

这是为了确保查询正确。在此示例中,您将从缓存的数据集data创建扩展dataset。现在,如果数据集data是未持久化的,则基本上扩展数据集不能再依赖于缓存的数据集data

这是他们所做的修复的拉取请求。你可以看到类似的JIRA票

Spark 2.4 的答案:

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

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

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

其中"常规模式"表示问题和@Avishek答案中的mdoe,非级联模式表示extension不会持久化

最新更新