[英]Spark non-cached RDD Eviction from memory
从这篇文章中,RDD可以保留多长时间? ,根据以下内容,我想知道:
就像其他对象一样,RDD是一个对象。 如果您不持久化/缓存它,它将与托管语言下的任何其他对象一起使用,并且一旦没有活动的根对象指向它,它就会被收集?
一旦没有活动的根对象指向它,到底意味着什么 ?
我读了尽可能多的书,但发现心中总有一个未解决的问题。 这位著名专家的回应使我心存疑虑,我无法驱逐。
RDD血统何时创建? 如何找到谱系图? 例子很棒,在这里重新展示:
val nums = sc.parallelize(0 to 9)
scala> nums.toDebugString
res0: String = (8) ParallelCollectionRDD[0] at parallelize at <console>:24 []
val doubles = nums.map(_ * 2)
scala> doubles.toDebugString
res1: String =
(8) MapPartitionsRDD[1] at map at <console>:25 []
| ParallelCollectionRDD[0] at parallelize at <console>:24 []
val groups = doubles.groupBy(_ < 10)
scala> groups.toDebugString
res2: String =
(8) ShuffledRDD[3] at groupBy at <console>:25 []
+-(8) MapPartitionsRDD[2] at groupBy at <console>:25 []
| MapPartitionsRDD[1] at map at <console>:25 []
| ParallelCollectionRDD[0] at parallelize at <console>:24 []
假设每个转换都需要很长时间才能实际执行,那么... RDD [0]什么时候可以被逐出? 即最早的时间点。 关键是... RDD [0]是... RDD [1..N]的父对象还是所有此类对象的父对象? 我在其他地方找到这样的声明时说。
我不认为它是重复的,它正在寻求澄清所陈述的内容。
我的解释是,术语“根对象”意味着RDD [0]不能进行垃圾回收,直到发生某个动作或在动作DAG路径中发生了缓存或检查点。 寻求验证。 对于我来说关于根对象是什么的句子现在还不清楚。 我以为根对象是链中较早的RDD。
RDD具有不同类型的内存足迹:
1)它消耗驱动程序上的内存(作为常规对象)
2)有关该RDD的信息已分配给工人
3)如果RDD被缓存,则可能会在worker上分配额外的空间
当RDD在(1)方面变得不可访问时,将通过ContextCleaner
触发对(2)和(3)的清除。 因此,我们仅谈论(1)。
是否缓存RDD根本不重要。 执行诸如count
/ collect
类的动作也无关紧要。 当您离开该RDD可见的范围时,RDD只是作为常规的Java对象而消失。
在您的特定示例中, RDD1
取决于RDD0
因此除非前者被驱逐,否则后者将不会被驱逐。 而RDD1
后,才被驱逐RDD2
这只会之后被驱逐RDD3
。 要为垃圾收集器解锁RDD3
,您必须(含糊地说)将方法保留在使用位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.