当Spark意识到它不再被使用时,Spark会不会自己解决它?

Met*_*est 29 hadoop distributed-computing bigdata apache-spark rdd

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

Dan*_*bos 23

是的,Apache Spark会在收集垃圾时解除RDD的速度.

RDD.persist你可以看到:

sc.cleaner.foreach(_.registerRDDForCleanup(this))
Run Code Online (Sandbox Code Playgroud)

这将WeakReference放入ReferenceQueue中的RDD,导致ContextCleaner.doCleanupRDDRDD被垃圾收集.那里:

sc.unpersistRDD(rddId, blocking)
Run Code Online (Sandbox Code Playgroud)

有关更多上下文,请参阅ContextCleaner以及添加它的提交.

当依赖垃圾收集来处理不适合的RDD时需要注意的一些事项:

  • RDD使用执行程序上的资源,并在驱动程序上进行垃圾收集.在驱动程序有足够的内存压力之前,无论执行程序的磁盘/内存有多大,RDD都不会自动解除.
  • 你无法解决部分RDD(某些分区/记录)的问题.如果您从另一个构建一个持久化RDD,则两者必须同时完全适合执行程序.

  • 你可以看到Spark调用`sc.unpersistRDD`.如果RDD持久保存到磁盘,它将从磁盘中删除.就那么简单.你不应该相信我 - 阅读代码.一点有用的信息:带有ReferenceQueue的WeakReference是Java魔法,它不会阻止对象的垃圾收集,但会在收集对象时生成"事件".这就是在GC上触发`unpersist`的方式. (2认同)