2016-12-08 4 views
1

RIBをsaveAsObjectFileで保存して、ドライバとエグゼキュータに一時ファイルを配布します。プログラムの最後にこれらのファイルをすべて削除したいと思います。それらを削除するには?スパーク・ドライバとエグゼキュータのテンポラリ・ファイルを削除

+0

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

+0

ありがとうございました。しかし、この記事では主にスパークシステムによって作成された一時ファイルについて説明します。私のファイルは私のアプリケーションプログラムによって作成されます。 – user1803467

答えて

1

Spark経由でデータを削除するための組み込みサポートはありません。ただし、元のRDDでforeachPartitionを使用すると、各パーティションで任意のコードを実行できます。つまり、実際にデータを保存した各エグゼキュータで少なくとも1回は実行されます。

保存したフォルダを削除するコードを実行すると(1つのエグゼキュータで複数のパーティションを保持できるため、同じエグゼキュータで複数回実行すると失敗しないことが保証されます)あなたが必要なもの。これはビットハックであり、100%の防弾ではないかもしれないことに注意:

// 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")) 
) 

EDIT:Apacheのコモンズを使用して、例えば

、例えば、場合のアプリケーションの実行1時エグゼキュータがクラッシュした場合、そのパーティションは他のエグゼキュータで再計算され、そのエグゼキュータのデータは削除されません。

+0

ありがとう、私はこのrddを再分割し、私のスパークエグゼキュータの番号に等しいパーティション番号を設定する必要がありますか?それ以外の場合は、スパークシステムの並列性に大きな数値を設定した場合、エグゼキュータで削除するには時間がかかります。 – user1803467

+0

実際にパーティションの数が非常に多い場合は、再パーティションが役立つかもしれませんが、これは素早い操作です(ほとんどのパーティションでファイルが存在するかどうかを確認するだけです)。 –

+0

ありがとう、私はあなたの提案をお試しになります。 – user1803467

関連する問題