当 Spark 意识到 RDD 将不再被使用时,它会取消它本身吗?

Posted

技术标签:

【中文标题】当 Spark 意识到 RDD 将不再被使用时,它会取消它本身吗?【英文标题】:Would Spark unpersist the RDD itself when it realizes it won't be used anymore? 【发布时间】:2015-09-17 17:50:19 【问题描述】:

当我们想要多次使用它时,我们可以将 RDD 持久化到内存和/或磁盘中。但是,我们以后是否必须自己取消持久化它,或者 Spark 会进行某种垃圾收集并在不再需要 RDD 时取消持久化它?我注意到如果我自己调用 unpersist 函数,我的性能会变慢。

【问题讨论】:

如果你缓存了一个RDD,你将不得不自己取消持久化! @eliasah 如果内存已满怎么办?不会以 LRU 方式激发 RDD 的持久性。 不,不是。 Spark 不是缓存系统。您可能会考虑使用外部缓存,或者您希望保留在磁盘和内存上。然而,如果磁盘上没有空间,您会得到一个 not space available on device 错误。 @eliasah:有趣,我的理解与你的完全相反。 1) RDD 在 GCd 时不会持久化。 2)内存压力也会将RDD从缓存中推出。 3) Spark 的很大一部分是缓存系统。我希望你能发布你的参考资料。我发布了关于不持久行为的答案,所以如果我错了,你也可以在那里纠正我。谢谢! 哈哈,你是对的——它当然没有被宣传为“缓存系统”。另外我不确定它是 LRU 还是 FIFO 或什么。顺便说一句,我略过您之前提到的 disk。有一个很好的观点:执行程序上的磁盘空间(由持久化到磁盘和洗牌文件的 RDD 使用)正在清理以响应驱动程序上的 GC。在驱动程序上触发 GC 之前,执行程序存在填满磁盘的危险。我们会在某些时候致电System.gc() 以尽量避免这种情况。 【参考方案1】:

是的,当 RDD 被垃圾回收时,Apache Spark 将取消持久化。

RDD.persist你可以看到:

sc.cleaner.foreach(_.registerRDDForCleanup(this))

当 RDD 被垃圾回收时,这会将一个对 RDD 的 WeakReference 放入 ReferenceQueue 中,从而导致 ContextCleaner.doCleanupRDD。还有:

sc.unpersistRDD(rddId, blocking)

有关更多上下文,请参阅一般的 ContextCleaner 和添加它的 commit。

依赖垃圾回收来处理非持久化 RDD 时需要注意的几点:

RDD 使用执行器上的资源,而垃圾收集发生在驱动程序上。在驱动程序有足够的内存压力之前,无论执行器的磁盘/内存有多满,RDD 都不会自动取消持久化。 您不能取消保留 RDD 的一部分(某些分区/记录)。如果您从另一个构建一个持久化 RDD,则两者都必须同时完全适合执行器。

【讨论】:

如果您实际上是在代码中对 RDD 定义 WeakReference,我们怎么能说 Spark 在垃圾收集时会这样做呢?对我来说,我们要求 Spark 在需要时为我们做事。尽管如此,即使我不完全同意“是”,我也会投票支持它的质量。 我不明白你的评论,我相信你也不明白我的帖子:)。 “在你的代码中”——我链接的所有代码都在 Spark 中。 Spark 会自动执行此操作。如果你持久化或缓存一个 RDD,当 RDD 为 GCd 时,它会被取消持久化。 但是如果你把它保存在磁盘上呢?我们都同意 Spark 可以做到这一点。 我所说的“在代码内”等同于“在 Spark 内部”:) 我认为造成混乱的原因是,有些人可能期望 Spark 彻底清除持久数据,但我不要相信是这样的。我们必须更多地研究垃圾收集器的细节。 如您所见,Spark 调用 sc.unpersistRDD。如果 RDD 被持久化到磁盘,它将从磁盘中删除。就那么简单。你不应该相信我——阅读代码。一点有用的信息:带有 ReferenceQueue 的 WeakReference 是 Java 魔法,它不会阻止对象的垃圾收集,但会在收集对象时生成“事件”。这就是在 GC 上触发 unpersist 的方式。【参考方案2】:

正如@Daniel 所指出的,Spark 将从缓存中删除分区。一旦没有更多可用内存,就会发生这种情况,并将完成using a least-recently-used algorithm。正如@eliasah 所指出的,这不是一个智能系统。

如果您没有缓存太多对象,则不必担心。如果缓存太多对象,JVM 收集时间就会变得过多,因此在这种情况下,最好取消持久化它们。

【讨论】:

以上是关于当 Spark 意识到 RDD 将不再被使用时,它会取消它本身吗?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Spark RDD ?

迭代 RDD 迭代器并应用限制时,Spark 似乎没有调用 hasNext

spark RDD union 非常慢

11.spark sql之RDD转换DataSet

Spark2.0啥时候使用rdd?

当Spark从S3读取大文件时,可以将数据分发到不同的节点