Spark'Dataset的行为不正常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark'Dataset的行为不正常相关的知识,希望对你有一定的参考价值。

最近我看到了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的内存,而不是没有“链接下一个”的所有数据集?

我的设置:

  • Spark版本:当前主人,RC为2.3
  • 比例:2.11
  • Java:OpenJDK 1.8

问题看起来类似于Understanding Spark's caching,但在这里我在做一些行动之前没有人。起初我在计算所有内容然后保存到存储中 - 我不知道缓存在RDD中是否与数据集中的相同

答案

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

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

Here是他们所做修复的Pull请求。你可以看到类似的JIRA门票

另一答案

解答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():遵循与drop tables / view相同的约定,即对临时视图使用非级联模式,对其余视图使用常规模式

“常规模式”意味着问题和@Avishek的答案和非级联模式意味着什么,extension将不会是无人问津的

以上是关于Spark'Dataset的行为不正常的主要内容,如果未能解决你的问题,请参考以下文章

java.util.UUID 的 Spark 数据集的不同行为

Java Spark Dataset MapFunction - 任务在没有任何类引用的情况下不可序列化

Spark 类型不匹配:无法从 DataFrame 转换为 Dataset<Row>

spark rdd df dataset

Smack ChatManager 行为不正常

使用自定义分区器解决Spark DataSet数据分区不均匀的问题