2016-12-08 45 views
1

我使用saveAsObjectFile保存RDD,以便臨時文件分佈在驅動程序和執行程序中。在程序結束時,我想刪除所有這些文件。如何刪除它們?刪除火花驅動程序和執行程序上的臨時文件

+0

可能的重複http://stackoverflow.com/questions/30093676/apache-spark-does-not-delete-temporary-directories?rq=1 – Rumoku

+0

非常感謝。但是這篇文章主要是關於由spark系統創建的臨時文件。我的文件是由我的應用程序創建的。 – user1803467

回答

1

沒有通過Spark刪除數據的內置支持。但是,您可以在原始RDD上使用foreachPartition在每個分區上運行任意任意一段代碼,這意味着 - 每個實際保存一些數據的執行程序至少運行一次。所以 - 如果你運行的代碼刪除了你保存到的文件夾(如果它在同一個執行器上運行多次,不會失敗,因爲一個執行器可以容納多個分區),你會得到你需要什麼。

例如,使用Apache Commons:中

// save 
rdd.saveAsObjectFile("/my/path") 

// use data... 

// before shutting down - iterate over saved RDD's partitions and delete folder: 
import org.apache.commons.io.FileUtils  
rdd.foreachPartition(i => 
    // deleteDirectory doesn't fail if directory does not exist 
    FileUtils.deleteDirectory(new File("/my/path")) 
) 

編輯:注意,這是一個有點哈克,而且也不可能是100%防彈:例如,如果應用程序執行的一個過程執行程序崩潰,其分區可能會在其他執行程序上重新計算,因此該執行程序上的數據不會被刪除。

+0

非常感謝,需要我重新分配這個rdd並將分區編號設置爲等於我的火花執行器的數量?否則,如果我爲火花系統的並行設置了大量數據,那麼在執行器中刪除的時間太多。 – user1803467

+0

如果確實分區數量非常大,重新分區可能會有所幫助,但由於這是一項快速操作(對於大多數分區,它只會檢查文件是否存在),我會按原樣嘗試並僅在必要時進行優化。 –

+0

非常感謝,我會嘗試你的建議。 – user1803467