2017-07-12 1 views
2

ファイル数が多い1000000を含むhdfsのフォルダを削除する必要があります。これは一度だけの作業ではなく、これは私の毎日の必要条件です。現在、私は以下を使用しています非常に速いhdfsで多数のファイルを持つフォルダを削除する方法

Configuration c=new Configuration(); 
FileSystem fs = FileSystem.get(c); 
fs.delete(folder,true); 

しかし、上記の時間は約3時間です。フォルダ全体を非常に速く削除できる方法はありますか?

+0

価値があります:https://stackoverflow.com/questions/34140344/how-to-delete-files-from-the-hdfs(ゴミ箱を無効にする) –

+0

@RC。データが永久に削除されることが確実であるときには、 '-skipTrash'を使うことは価値があります。しかし、その影響はおそらくほとんどない(もしあれば)。このオプションは、基本的にquotaを超えたディレクトリの場合に便利です。ゴミ処理は、単純なメタデータ操作として実装されます。これは、ディレクトリ内のファイル数やサイズにかかわらず高速に完了します。 – Pierre

+0

@RCゴミ箱はすでにゼロ間隔で無効にされています –

答えて

2

簡易回答:できません。

理由を説明しましょう。フォルダを削除すると、そのフォルダに含まれるすべてのファイルへの参照(再帰的に)がすべて削除されます。これらのファイル(チャンクの場所)に関するメタデータは、namenodeに保持されます。

データノードにはデータチャンクが格納されますが、基本的にはそれが対応する実際のファイルについては考えられません。技術的には、フォルダへのすべての参照をnamenodeから削除することはできますが、フォルダが削除されているように見えますが、データはデータノードに残っているため、データが「死んでいる」ことを知る方法がありません。

このように、フォルダを削除すると、すべてのファイルに対して、クラスタ全体に広がっているすべてのデータチャンクからすべてのメモリを最初に再利用する必要があります。これにはかなりの時間がかかりますが、基本的には避けられません。

バックグラウンドスレッドで削除を処理するだけで済みます。これは長いプロセスでは役に立ちませんが、少なくともこのプロセスをアプリケーションから隠すことになります。

+0

これらのファイルを削除するためにmap-reduceプログラムを使用すると、マッパーごとに500ファイルになる可能性があります。または、ドライバプログラムがファイルをロードするのに時間がかかるのと同じです –

+0

@agarwal_achhneraなぜMRを使ってファイルを削除しますか?そのポイントはファイルを処理することであり、通常は保守操作を行わないことです。 – Pierre

+0

これは、1000000個のファイルがあると仮定できるので、500個のファイルごとに1個のマッパーを作成するので、合計2000個のマッパーは同時に500個のファイルの削除要求を送信します。 namenodeがとても速く動作するかどうかはわかりませんが、助けてくれるかどうかを尋ねるだけです。 –

関連する問題