基本上我一直在运行Spark应用程序,它在Hadoop集群上执行几千个Spark作业(使用YARN资源管理器)。该应用程序使用yarn-client
模式从Eclipse运行。一段时间后,我的本地机器上的tmp目录正在填充沿着作业发送的jar,并且目录没有被清理。
我检查了ShutdownHookManager
的行为,似乎临时目录只在JVM关闭时被清除,这在我的情况下不会发生,因为我使用相同的JVM实例来运行多个作业。 / p>
我在日志文件中看到以下行,它表示为每个不同作业存储jar的目录:
2016-03-30 15:38:22,113 [pool-1-thread-1] INFO org.apache.spark.HttpFileServer - HTTP File server directory is /tmp/spark-9589b88f-560a-48ef-9f42-fc7da2ecb7ee/httpd-3b9bd920-2446-43e1-bda9-de5e636ff219
但我无法找到如何以编程方式检测此目录,因此我可以在完成作业后自行清理它。我一直在查看源代码,似乎可以在Spark 1.4中获得HttpFileServer
的引用,但不能在 1.6 版本中获得引用。
SparkEnv.get().sparkFilesDir()
也不起作用,因为它提供了用户文件的目录,但它是空的(目录看起来像/tmp/spark-9589b88f-560a-48ef-9f42-fc7da2ecb7ee/userFiles-9b282866-6a27-4ab4-a093-0c134b941dd2
)。
我也无法清除/tmp/spark-9589b88f-560a-48ef-9f42-fc7da2ecb7ee
,因为多个作业可以同时运行,我可能会有删除当前活动作业目录的风险。
所以问题是,如何找到日志中指向的目录或如何正确清理已完成的特定作业的临时文件?