Apache spark 在spark数据帧联合中,联合后内存中的父数据帧会发生什么变化?

Apache spark 在spark数据帧联合中,联合后内存中的父数据帧会发生什么变化?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,在spark数据帧联合中,联合后内存中的父数据帧会发生什么情况?如果存在内存或CPU占用空间,如何执行垃圾收集 val childDf = parentDf1.union(parentDf2) 联合是否会在父数据帧上导致缓存或持久化 做 有效果吗 由于spark具有延迟求值,所以如果我从不引用父df的parentDf1 parentDf2,它们将不会被缓存或持久化 联合后,父数据帧对内存或CPU是否有任何其他影响 我是否可以确保在使用parentDf1和parentDf2之后不会留下任何痕迹?

在spark数据帧联合中,联合后内存中的父数据帧会发生什么情况?如果存在内存或CPU占用空间,如何执行垃圾收集

val childDf = parentDf1.union(parentDf2)
联合是否会在父数据帧上导致缓存或持久化

有效果吗

由于spark具有延迟求值,所以如果我从不引用父df的parentDf1 parentDf2,它们将不会被缓存或持久化

联合后,父数据帧对内存或CPU是否有任何其他影响


我是否可以确保在使用parentDf1和parentDf2之后不会留下任何痕迹?

从功能上讲,您无需对RDD或父RDD执行任何操作,因为当不再需要它们时,它们将作为Java对象进行垃圾收集。Spark中有一个对象ContextCleaner被分配了此角色

如果Spark应用程序终止,或者这些RDD所基于的操作完成,那么ContextCleaner将清理它们,或者您可以使用unpersist操作来明确地执行此操作,正如您所提到的。我不相信我会打扰你,因为你需要小心;我还读了一篇关于一些副作用的博客:

引用其他地方的话:RDD和其他对象一样是一个对象。如果 如果不持久化/缓存它,它将充当 一旦没有活动根,托管语言将被收集 指向它的对象

这意味着,如果您通过映射使用rdd1-->rdd2-->rdd3,那么当应用于rdd3的操作结束或作业崩溃且无法恢复时,这是ContextCleaner从rdd3开始,然后向后工作的垃圾收集分区和RDD的一个信号(无论何时)。例如,如果rdd3尚未被逐出,则无法逐出rdd2

在您的情况下:父数据帧可能会在“缓存”中徘徊,即使它们没有显式缓存/持久化,因为Spark需要存储中间结果作为计算结果等,以便通过DAG、bla、bla、bla进行可能的重新计算

此外,Spark Context Cleaner监控缓存使用情况、每个节点上数据管道中使用的存储,并在最近使用最少(LRU)的基础上删除旧数据分区,而不管是否显式缓存


如果您想手动删除RDD,而不是等待它通过ContextCleaner退出,您可以使用RDD.unpersist()方法,但要在正确的代码位置进行删除。

这并不明显,代码也很难理解,但逻辑应该告诉您一些事情,但正如我所说的,我喜欢这个问题,也对其中的一些内部内容感到好奇。虽然spark是一个很棒的框架,但关于这个问题的文档并不清楚,我学到了不相信逻辑和常识的艰难方法。我可以从文档提供的tgat中看出,u不需要unpersist。它指出,在某些情况下,缓存或持久化自动发生
parentDf1.unpersist(true)