Spark清理shuffle溢出到磁盘

fob*_*122 5 scala out-of-memory apache-spark spark-streaming

我有一个循环操作,它生成一些 RDD,进行重新分区,然后进行聚合键操作。循环运行一次后,它会计算出最终的 RDD,该 RDD 会被缓存和检查点,并用作下一个循环的初始 RDD。

这些 RDD 非常大,并且在每次迭代到达最终 RDD 之前都会生成大量中间 shuffle 块。我正在压缩我的随机播放并允许随机播放到磁盘。

我注意到在我的工作机器上,存储随机播放文件的工作目录没有被清理。因此最终我用完了磁盘空间。我的印象是,如果我检查 RDD,它将删除所有中间的 shuffle 块。然而这似乎并没有发生。有人知道如何在每次循环迭代后清理我的随机播放块,或者为什么我的随机播放块没有被清理吗?

Avi*_*mka 1

将 RDD 缓存到内存/磁盘后,只要 Spark 上下文处于活动状态,RDD 就会存储在您的内存/磁盘中。

为了告诉驱动程序它可以从内存/磁盘中删除 RDD,您需要使用该unpersist()函数。

来自java-doc

 /**
   * Mark the RDD as non-persistent, and remove all blocks for it from memory and disk.
   *
   * @param blocking Whether to block until all blocks are deleted.
   * @return This RDD.
   */
  def unpersist(blocking: Boolean = true)
Run Code Online (Sandbox Code Playgroud)

所以你可以使用:

rdd.unpersist()