2015-05-07 117 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()。