/ work / app-xxxxxxx / {0,1,2,...}中的spark worker目录的用途和定期清除

问题描述

我正在运行一个Spark 3.4长期运行的结构化流作业。每当作业开始时,都会在 work 目录中为该作业创建格式为 app-xxxxxxxxxx 的应用程序目录。但是,在该目录中会创建其他目录,第一个目录名为 0 ,第二个目录名为 1 ,依此类推。

我的第一个问题是,为什么要创建这些目录?在结构化流作业的过程中,微型批处理可能会触发20次,但是在 app-xxxxxxxxxx 目录下仅创建了4个这些子目录,关键是要创建这些子目录不符合微型批次的执行。因此,我不确定为什么要创建它们。

第二个相关问题是,如何配置Spark在一定时间后删除这些文件夹?每个文件都包含应用程序.jar和stderr和stdout文件,因此随着时间的推移,它们将占用大量空间。我的理解是,设置spark.worker.cleanup.enabled=true仅启用清除已停止的应用程序。但是,就我而言,我有一个运行时间较长的应用程序,希望对此进行清除。

解决方法

您正在谈论 work 目录和配置 spark.worker ,所以我的假设是您正在Spark的独立模式下运行流作业(不使用集群)经理,例如YARN,因为那里的情况完全不同。

根据Spark Standalone Mode上的文档,工作目录被描述为:在其中运行应用程序的目录,其中将同时包含日志和暂存空间(默认:SPARK_HOME / work)。

此处暂存空间表示它是“包括存储在磁盘上的地图输出文件和RDD。它应该在系统中的快速本地磁盘上。它也可以是逗号-在不同磁盘上的多个目录的分隔列表。”

work 文件夹中,您将为每个应用程序找到.jar库,以便执行者可以访问这些库。此外,它包含一些基于处理逻辑和实际数据的临时数据(而不是基于处理触发器的数量)。子文件夹 0 1 对于同一应用程序的不同作业/阶段或运行,是递增的。 (坦率地说,我对这些子文件夹并不完全了解。)

可以通过here中所述的SPARK_WORKER_OPTS的以下三种配置来调整此文件夹的清除:

spark.worker.cleanup.enabled -默认值:false: 启用定期清理worker /应用程序目录。请注意,这仅影响独立模式,因为YARN的工作原理不同。仅清除已停止应用程序的目录。如果spark.shuffle.service.db.enabled为“ true”,则应启用此选项

spark.worker.cleanup.interval -默认值:1800(30分钟): 控制工作人员清理本地计算机上旧的应用程序工作目录的时间间隔(以秒为单位)。

spark.worker.cleanup.appDataTtl -默认值:604800(7天,7 * 24 * 3600): 在每个工作程序上保留应用程序工作目录的秒数。这是生存时间,应取决于您拥有的可用磁盘空间量。应用程序日志和jar将下载到每个应用程序工作目录。随着时间的推移,工作目录会迅速填满磁盘空间,尤其是如果您非常频繁地运行作业时。