Spark ContextCleaner无法从usercache blockmgr文件夹中删除溢出数据

nvbavucw  于 6个月前  发布在  Apache
关注(0)|答案(1)|浏览(82)

我有一个spark应用程序,我加载一个Dataset,将它与其他数据集连接。然后将结果写入一些输出。我对不同的数据集重复相同的过程多次。我没有对数据集进行任何缓存。
当应用程序是活的2-3个小时,它最终填补了我的磁盘文件夹

usercache/something/appcache/application_1696806712764_495852/blockmgr-something/

字符串
我可以看到有很多文件夹创建的shuffle.data和shuffle.index文件。
作为parx 1 e0f1x回答RDD应该自动清理一旦GC踢。我已经尝试了一切
1.手动将数据集设置为空,以便没有延迟引用
1.调用dataset.unpersist(即使我没有使用缓存或其他东西,但仍然。
1.在驱动程序上手动调用GC
根据我的研究,ContextCleaner应该已经处理或删除这些文件,但我没有看到contextcleaner日志在我的应用程序。x1c 0d1x
通过启用驱动程序的调试日志,我可以看到上下文清理正在运行,并标记了要删除的随机文件。

23/11/01 20:23:36 DEBUG ContextCleaner: Got cleaning task CleanShuffle(4)
23/11/01 20:23:36 DEBUG ContextCleaner: Cleaning shuffle 4
23/11/01 20:23:36 DEBUG ContextCleaner: Cleaned shuffle 4


我在我的执行器上启用了调试日志,

23/11/02 10:41:17 DEBUG BlockManagerStorageEndpoint: removing shuffle 17
23/11/02 10:41:17 DEBUG BlockManagerStorageEndpoint: Done removing shuffle 17, response is true
23/11/02 10:41:17 DEBUG BlockManagerStorageEndpoint: Sent response: true to somehostname:24399


文件仍然存在于磁盘上。

ilmyapht

ilmyapht1#

这个问题的答案是,这取决于你使用的配置和spark版本。
如果你正在使用spark shuffle服务(spark.shuffle.service.enabled为true),则shuffle清理代码仅从this PR的3.4.0添加。
如果你没有使用spark shuffle服务,因此SortShuffleManager默认使用,有一个bug得到了fixed in spark 3.2.0。这可能是文件可能不会为你清理的原因。
在其他情况下,如果你的RDD/dataset是java垃圾收集的,那么它们应该被清理。最坏情况下的频率默认为30分钟,可以通过spark config控制。
spark.cleaner.periodicGC.interval
如果你想看看什么是得到清理或不添加下面的配置,以了解发生了什么

log4j.logger.org.apache.spark.ContextCleaner=DEBUG
log4j.logger.org.apache.spark.rpc.=DEBUG
log4j.logger.org.apache.spark.storage.BlockManagerStorageEndpoint=DEBUG
log4j.logger.org.apache.spark.storage.=DEBUG

字符串

相关问题