【问题标题】:Apache Spark does not delete temporary directoriesApache Spark 不会删除临时目录
【发布时间】:2015-07-17 14:09:15
【问题描述】:

spark程序完成后,temp目录中还剩下3个临时目录。 目录名是这样的:spark-2e389487-40cc-4a82-a5c7-353c0feefbb7

目录为空。

当 Spark 程序在 Windows 上运行时,一个快速的 DLL 文件也保留在 temp 目录中。 文件名是这样的:snappy-1.0.4.1-6e117df4-97b6-4d69-bf9d-71c4a627940c-snappyjava

它们是在 Spark 程序每次运行时创建的。所以文件和目录的数量不断增长。

如何让他们被删除?

Spark 版本是 1.3.1 和 Hadoop 2.6。

更新

我已经追踪了 spark 源代码。

创建 3 个 'temp' 目录的模块方法如下:

  • DiskBlockManager.createLocalDirs
  • HttpFileServer.initialize
  • SparkEnv.sparkFilesDir

他们(最终)调用 Utils.getOrCreateLocalRootDirs,然后调用 Utils.createDirectory,它故意不将目录标记为自动删除。

createDirectory 方法的注释说:“目录保证是 新创建的,并且没有标记为自动删除。”

我不知道为什么它们没有被标记。这真的是故意的吗?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    存在三个SPARK_WORKER_OPTS以支持worker应用程序文件夹清理,复制到这里以供进一步参考:来自Spark Doc

    • spark.worker.cleanup.enabled,默认值为false,启用工作/应用程序目录的定期清理。请注意,这只影响独立模式,因为 YARN 的工作方式不同。只清理已停止应用的目录。

    • spark.worker.cleanup.interval,默认为1800,即30分钟,控制worker清理本地机器上旧应用程序工作目录的时间间隔,以秒为单位。

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

    【讨论】:

    • 谢谢,但这仅适用于 Spark 独立模式。 'temp' 目录是为本地模式和 YARN 客户端模式创建的。
    【解决方案2】:

    我假设您仅出于测试目的使用“本地”模式。我通过在运行测试之前创建自定义临时文件夹然后手动删除它解决了这个问题(在我的情况下,我在 JUnit 中使用本地模式,因此临时文件夹会被自动删除)。

    您可以通过spark.local.dir 属性更改 Spark 临时文件夹的路径。

    SparkConf conf = new SparkConf().setMaster("local")
                                    .setAppName("test")
                                    .set("spark.local.dir", "/tmp/spark-temp");
    

    测试完成后我会手动删除/tmp/spark-temp文件夹。

    【讨论】:

    • 谢谢,这是一种可能的解决方法。顺便说一句,我已经为此问题提交了 JIRA。请参阅issues.apache.org/jira/browse/SPARK-7439
    • 感谢您拯救了这一天
    • 有没有办法自动删除这些文件?
    【解决方案3】:

    我不知道如何让 Spark 清理那些临时目录,但我能够阻止 snappy-XXX 文件的创建。这可以通过两种方式完成:

    1. 禁用压缩。属性:spark.broadcast.compress、spark.shuffle.compress、spark.shuffle.spill.compress。见http://spark.apache.org/docs/1.3.1/configuration.html#compression-and-serialization
    2. 使用 LZF 作为压缩编解码器。 Spark 使用 Snappy 和 lz4 的本地库。而且由于 JNI 的工作方式,Spark 必须在使用这些库之前对其进行解包。 LZF 似乎是用 Java 原生实现的。

    我在开发期间这样做,但对于生产来说,使用压缩并有一个脚本来清理临时目录可能会更好。

    【讨论】:

    【解决方案4】:

    我认为并非所有场景都支持清理。我建议编写一个简单的 windows 调度程序来清理夜间。

    【讨论】:

      【解决方案5】:

      您需要在程序结束时创建的火花上下文上调用 close()。

      【讨论】:

        【解决方案6】:

        对于spark.local.dir,它只会移动 spark 临时文件,但 snappy-xxx 文件仍将存在于 /tmp 目录中。 虽然没找到让spark自动清除的方法,但是可以设置JAVA选项:

        JVM_EXTRA_OPTS=" -Dorg.xerial.snappy.tempdir=~/some-other-tmp-dir"
        

        让它移动到另一个目录,因为大多数系统都有小 /tmp 大小。

        【讨论】:

          猜你喜欢
          • 2023-03-16
          • 2015-11-29
          • 2017-10-06
          • 1970-01-01
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          • 2017-06-09
          • 2018-11-05
          相关资源
          最近更新 更多