Apache Spark不会删除临时目录

时间:2015-05-07 06:40:35

标签: apache-spark

火花程序完成后,temp目录中还有3个临时目录。 目录名称如下:spark-2e389487-40cc-4a82-a5c7-353c0feefbb7

目录为空。

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

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

怎样才能删除它们?

使用Hadoop 2.6,Spark版本为1.3.1。

更新

我已经追踪了火花源代码。

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

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

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

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

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

6 个答案:

答案 0 :(得分:22)

存在三个SPARK_WORKER_OPTS以支持工作人员应用程序文件夹清理,复制到此处以供进一步参考:来自Spark Doc

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

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

  • spark.worker.cleanup.appDataTtl,默认为7 * 24 * 3600(7天),保留每个工作人员的应用程序工作目录的秒数。这是一个生存时间,应该取决于您拥有的可用磁盘空间量。应用程序日志和jar将下载到每个应用程序工作目录。随着时间的推移,工作目录可以快速填满磁盘空间,特别是如果您经常运行工作。

答案 1 :(得分:16)

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

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

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

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

答案 2 :(得分:1)

我不知道如何使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本地实现的。
  3. 我在开发过程中这样做,但是对于生产来说,最好使用压缩并使用脚本来清理临时目录。

答案 3 :(得分:0)

I do not think cleanup is supported for all scenarios. I would suggest to write a simple windows scheduler to clean up nightly.

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

使其移动到另一个目录,因为大多数系统的小/ tmp大小。