spark 会自动取消缓存并删除未使用的数据帧吗?

Does spark automatically un-cache and delete unused dataframes?

我有以下更改数据框的策略df

df = T1(df)
df.cache()
df = T2(df)
df.cache()
.
.
.
df = Tn(df)
df.cache()

这里 T1, T2, ..., Tn 是 return 激发数据帧的 n 个转换。使用重复缓存是因为df要经过很多次转换,中间使用了多次;如果不缓存转换的惰性评估,可能会使在两者之间使用 df 变得非常慢。我担心的是,一个一个缓存的n个数据帧会逐渐消耗RAM。我读到 spark 会自动取消缓存“最近最少使用”的项目。基于此,我有以下查询 -

  1. “最近最少使用”参数是如何确定的?我希望没有附加任何参考或评估策略的数据框符合未使用的条件 - 我说得对吗?
  2. 没有附加参考和评估策略的 spark 数据框是否也被选中进行垃圾收集?还是 spark 数据框永远不会被垃圾收集?
  3. 根据以上两个问题的答案,以上策略是否正确?

就我使用 spark 以及与 cloudera 的通信而言,我们应该 unpersist/uncache 数据,如果我们不这样做,工作将开始变慢,问题在流作业的情况下变得更加严重。

我没有任何证据支持我的回答,但是 阅读 here and here 了解详情

How is "least recently used" parameter determined? I hope that a dataframe, without any reference or evaluation strategy attached to it, qualifies as unused - am I correct?

结果缓存在 spark 执行器上。单个执行程序运行多个任务,并且在给定的时间点在其内存中可能有多个缓存。单个执行程序缓存根据被询问的时间进行排名。在某些计算中刚请求的缓存将始终具有等级 1,而其他的则被推低。最终,当可用 space 已满时,最后一个等级的缓存将被丢弃,为新缓存创建 space。

Does a spark dataframe, having no reference and evaluation strategy attached to it, get selected for garbage collection as well? Or does a spark dataframe never get garbage collected?

Dataframe 是一个执行表达式,除非调用一个动作,否则不会实现任何计算。此外,一旦执行者完成了该任务的计算,所有内容都将被清除。只有当数据帧被缓存时(在调用操作之前),结果才会保存在执行程序内存中以供进一步使用。并且这些结果缓存是基于LRU来清除的。

Based on the answer to the above two queries, is the above strategy correct?

您的示例似乎是按顺序完成转换,并且未进一步使用对先前数据帧的引用(不知道您为什么要使用缓存)。如果多次执行由同一个执行者完成,则可能会丢弃一些结果,当被询问时,它们将再次重新计算。

N.B。 - 除非调用 spark 操作,否则不会执行任何操作。 调用操作时,转换由 spark 引擎链接和优化。