RDD在内存中保留多长时间?

Fai*_*lde 7 apache-spark rdd

考虑到内存有限,我感觉火花会自动从每个节点中删除RDD.我想知道这个时间是可配置的吗?spark如何决定何时从内存中驱逐RDD

注意:我不是在谈论 rdd.cache()

Yuv*_*kov 8

我想知道这个时间是可配置的吗?spark如何决定何时从内存中驱逐RDD

An RDD就像任何其他对象一样.如果你不持久/缓存它,它将作为托管语言下的任何其他对象,并且一旦没有指向它的活动根对象就被收集.

@Jacek指出的"如何"部分是一个被称为对象的责任ContextCleaner.主要是,如果您需要详细信息,这就是清洁方法的样子:

private def keepCleaning(): Unit = Utils.tryOrStopSparkContext(sc) {
  while (!stopped) {
    try {
      val reference = Option(referenceQueue.remove(ContextCleaner.REF_QUEUE_POLL_TIMEOUT))
          .map(_.asInstanceOf[CleanupTaskWeakReference])
      // Synchronize here to avoid being interrupted on stop()
      synchronized {
        reference.foreach { ref =>
          logDebug("Got cleaning task " + ref.task)
          referenceBuffer.remove(ref)
          ref.task match {
            case CleanRDD(rddId) =>
              doCleanupRDD(rddId, blocking = blockOnCleanupTasks)
            case CleanShuffle(shuffleId) =>
              doCleanupShuffle(shuffleId, blocking = blockOnShuffleCleanupTasks)
            case CleanBroadcast(broadcastId) =>
              doCleanupBroadcast(broadcastId, blocking = blockOnCleanupTasks)
            case CleanAccum(accId) =>
              doCleanupAccum(accId, blocking = blockOnCleanupTasks)
            case CleanCheckpoint(rddId) =>
              doCleanCheckpoint(rddId)
            }
          }
        }
      } catch {
        case ie: InterruptedException if stopped => // ignore
        case e: Exception => logError("Error in cleaning thread", e)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你想学习移动,我建议浏览Sparks源码甚至更好,阅读@Jacek一书名为"掌握Apache Spark"(这指向一个解释ContextCleaner)


Jac*_*ski 5

通常,这就是尤瓦尔·伊茨恰科夫(Yuval Itzchakov)写下 “就像其他任何物体一样”的方式,但是...(总是有“但是”,不是吗?

在Spark中,这不是很明显,因为我们有shuffle块(在Spark管理的其他块中)。它们由在执行程序上运行的BlockManagers管理。从内存中清除驱动程序上的对象时,必须以某种方式通知他们,对吗?

那就是ContextCleaner上台的地方。它是Spark应用程序的垃圾收集器,负责在应用程序范围内清理随机播放,RDD,广播,累加器和检查点的RDD,旨在减少长时间运行的数据繁重的Spark应用程序的内存需求。

ContextCleaner在驱动程序上运行。它会创建并在启动时立即SparkContext启动(并且spark.cleaner.referenceTracking启用了Spark属性,默认情况下为启用状态)。停止时SparkContext停止。

您可以使用jconsole或进行Spark应用程序中所有线程的转储来查看其工作情况jstack。ContextCleaner使用守护程序Spark Context Cleaner线程来清理RDD,随机播放和广播状态。

您还可以通过启用INFODEBUG记录org.apache.spark.ContextCleaner记录器级别来查看其工作。只需将以下行添加到conf/log4j.properties

log4j.logger.org.apache.spark.ContextCleaner=DEBUG
Run Code Online (Sandbox Code Playgroud)