我有一个循环操作,它生成一些 RDD,进行重新分区,然后进行聚合键操作。循环运行一次后,会计算出最终的 RDD,该 RDD 会被缓存和检查点,并用作下一次循环的初始 RDD。
这些 RDD 非常大,并且在每次迭代到达最终 RDD 之前都会生成大量中间 shuffle block 。我正在压缩我的随机播放并允许随机播放到磁盘。
我注意到在我的工作机器上,存储随机文件的工作目录没有被清理。因此最终我用完了磁盘空间。我的印象是,如果我检查 RDD,它将删除所有中间的 shuffle block 。然而这似乎并没有发生。有人知道如何在每次循环迭代后清理我的随机播放 block ,或者为什么我的随机播放 block 没有被清理吗?
最佳答案
将 RDD 缓存到内存/磁盘后,只要 Spark 上下文处于事件状态,RDD 就会存储在您的内存/磁盘中。
为了告诉驱动程序它可以从内存/磁盘中删除 RDD,您需要使用 unpersist()
函数。
From the
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)
所以你可以使用:
rdd.unpersist()
关于scala - Spark清理shuffle溢出到磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34788507/