繁体   English   中英

从内存中触发非缓存的RDD逐出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM