2015-05-07 76 views
22

在完成一个spark程序后,临时目录中会有3个临时目录。 目录名称如下:spark-2e389487-40cc-4a82-a5c7-353c0feefbb7Apache Spark不会删除临时目录

目录为空。

而当星火程序运行在Windows上,一个活泼的DLL文件还留在临时目录。 文件的名称是这样的:snappy-1.0.4.1-6e117df4-97b6-4d69-bf9d-71c4a627940c-snappyjava

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

如何让它们被删除?

Spark版本是1.3.1与Hadoop 2.6。

UPDATE

我跟踪的火花源代码。

创造的3 '临时' 目录的模块方法如下:

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

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

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

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

回答

0

我不认为所有场景都支持清理。我会建议编写一个简单的Windows调度程序来清理每晚。

1

我不知道如何使星火清理那些临时目录,但我能够防止活泼-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中本地实现。

我在开发过程中正在这样做,但对于生产来说,使用压缩并使用脚本来清理临时目录可能更好。

+0

虽然我还没有测试过,但可能会设置系统属性org.xerial.snappy.lib.path,以便快速模块查找快速的DLL,而不是无条件地提取DLL。查看源文件的评论https://github.com/rvs/snappy-java/blob/master/src/main/java/org/xerial/snappy/SnappyLoader.java – zeodtr

+0

但根据https:// github。 com/xerial/snappy-java/issues/46,它可能已经被解决了。也许Spark有更老的库? – zeodtr

19

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下载到每个应用程序工作目录。随着时间的推移,工作目录可能会很快填满磁盘空间,特别是如果您频繁运行作业。

+3

谢谢,但它只适用于Spark独立模式。 'temp'目录是为本地模式和YARN客户端模式创建的。 – zeodtr

10

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

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

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

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

+1

谢谢,这是一种可能的解决方法。顺便说一句,我已经为这个问题提交了JIRA。请参阅https://issues.apache.org/jira/browse/SPARK-7439。 – zeodtr

+0

谢谢你保存了一天 – codeRock

0

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