我在Google Cloud中有一个DataProc集群。
我在其中执行一个Spark应用程序。这个应用程序就像一个Web服务器。它监听请求;然后触发Spark作业(又名:Spark操作)并返回结果。集群只专用于我的Spark应用程序;没有其他作业在其中运行。集群中的每个节点都有375 GB的硬盘连接到它。
当spark应用程序完成请求时,它派生的spark作业(操作)会创建大量的shuffle数据。
我的预期是:由于spark应用程序一直在运行,它会在某个时候耗尽shuffle数据的磁盘空间(因为它一直在获取请求)。我甚至在Spark UI中监视到聚合的shuffle数据正在增长,甚至已经超过375 GB;但作业正在满足新的请求,而不会抛出任何磁盘错误异常。
在应用程序中,我也启用了外部 Shuffle 服务。
因此,很明显,应用程序正在删除shuffle数据;但不确定哪个spark进程正在删除shuffle数据。
是执行者进程本身还是运行在每个节点上的外部shuffle服务进程?还是驱动程序进程?
有人能把光。
谢谢
1条答案
按热度按时间4bbkushb1#
Spark有一个用于应用程序范围清理的组件-
ContextCleaner
。它运行在驱动程序上,并在ShuffleDependency
示例没有引用时删除shuffle文件。字符串
所以,这个过程有点依赖于JVM垃圾收集的行为。相关引用来自[SPARK-5750][SPARK-3441][SPARK-5836][CORE]下面是解释shuffle的新增文档。
我知道有一些关于 Shuffle 文件填充磁盘的担忧,但截至目前,可能会发生,因为以下一个或多个原因。
1.没有超出范围的内容,因此没有任何内容是GCed的。
1.有一些问题报告与 Shuffle 文件没有被清理在Mesos
第三个是一个错误,我们将修复它。前两个应该在文档中澄清。
为了减少资源释放的延迟,我将
Dataset
和RDD
变量设置为null
,如果数据在不再需要时被缓存,则调用Dataset.unpersist()
和RDD.unpersist()
函数。有关详细信息,请参阅Oracle博客中的When are Java objects eligible for garbage collection?页和Spark的RDD编程指南中的删除数据一节。清除器默认启用。请参阅Spark Configuration页了解更多信息。