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 会自动取消缓存“最近最少使用”的项目。基于此,我有以下查询 -
- “最近最少使用”参数是如何确定的?我希望没有附加任何参考或评估策略的数据框符合未使用的条件 - 我说得对吗?
- 没有附加参考和评估策略的 spark 数据框是否也被选中进行垃圾收集?还是 spark 数据框永远不会被垃圾收集?
- 根据以上两个问题的答案,以上策略是否正确?
就我使用 spark 以及与 cloudera 的通信而言,我们应该 unpersist/uncache 数据,如果我们不这样做,工作将开始变慢,问题在流作业的情况下变得更加严重。
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 引擎链接和优化。
我有以下更改数据框的策略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 会自动取消缓存“最近最少使用”的项目。基于此,我有以下查询 -
- “最近最少使用”参数是如何确定的?我希望没有附加任何参考或评估策略的数据框符合未使用的条件 - 我说得对吗?
- 没有附加参考和评估策略的 spark 数据框是否也被选中进行垃圾收集?还是 spark 数据框永远不会被垃圾收集?
- 根据以上两个问题的答案,以上策略是否正确?
就我使用 spark 以及与 cloudera 的通信而言,我们应该 unpersist/uncache 数据,如果我们不这样做,工作将开始变慢,问题在流作业的情况下变得更加严重。
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 引擎链接和优化。