指定されたディレクトリでアーカイブを受信し、アーカイブを開いてその中のファイルを処理する mapreduce ジョブを定期的に起動するシステムがあります。次回同じアーカイブを再処理するのを避けるために、RecordReader の close() メソッドにフックして、最後のエントリが読み取られた後に削除されるようにします。
このアプローチの問題点は (私たちが考えている)、特定のマッピングが失敗した場合、別のマッピングを試みた次のマッパーが、元のファイルがレコード リーダーによって最初のファイルから削除されていることを発見し、爆発することです。すべてのマッピングと縮小が完了するまで待ってから、入力アーカイブを削除するのがよいと思います。
これはこれを行うための最良の方法ですか?
もしそうなら、システムが見つけたすべての入力ファイルのリストをメインプログラムから取得するにはどうすればよいでしょうか? (入力ディレクトリ全体をスクラブすることはできません。新しいファイルが存在する可能性があります)
すなわち:
. . .
job.waitForCompletion(true);
(we're done, delete input files, how?)
return 0;
}