我有一个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
型
文件仍然存在于磁盘上。
1条答案
按热度按时间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
如果你想看看什么是得到清理或不添加下面的配置,以了解发生了什么
字符串