4

指定されたディレクトリでアーカイブを受信し、アーカイブを開いてその中のファイルを処理する mapreduce ジョブを定期的に起動するシステムがあります。次回同じアーカイブを再処理するのを避けるために、RecordReader の close() メソッドにフックして、最後のエントリが読み取られた後に削除されるようにします。

このアプローチの問題点は (私たちが考えている)、特定のマッピングが失敗した場合、別のマッピングを試みた次のマッパーが、元のファイルがレコード リーダーによって最初のファイルから削除されていることを発見し、爆発することです。すべてのマッピングと縮小が完了するまで待ってから、入力アーカイブを削除するのがよいと思います。

これはこれを行うための最良の方法ですか?

もしそうなら、システムが見つけたすべての入力ファイルのリストをメインプログラムから取得するにはどうすればよいでしょうか? (入力ディレクトリ全体をスクラブすることはできません。新しいファイルが存在する可能性があります)

すなわち:

   . . .

   job.waitForCompletion(true);

   (we're done, delete input files, how?)

   return 0;
}
4

4 に答える 4

2

カップルのコメント。

  1. このデザインは心が痛みやすいと思います。誰かがめちゃくちゃなアルゴリズムを MR クラスターにデプロイしたことを発見し、1 か月分のアーカイブをバックフィルする必要がある場合はどうなりますか? 彼らはもういません。処理に予想以上の時間がかかり、古いジョブが完了する前に新しいジョブを開始する必要がある場合はどうなりますか? 存在するファイルが多すぎて、一部が再処理されます。アーカイブの処理中にジョブが開始された場合はどうなるでしょうか? 等。

  2. この罠から抜け出す方法の 1 つは、アーカイブを時間に基づいて回転する場所に移動させ、自分でレコードをパージするか、(S3 のようなものの場合) 操作のための特定のウィンドウを許可する保持ポリシーを確立することです。また、バックエンドの map reduce 処理が何を行っていても、べき等である可能性があります。同じレコードを 2 回処理することは、1 回処理することと何ら変わりはありません。データセットを減らすと、そのプロパティを保証するのが難しくなることがわかります。

  3. 少なくとも、処理したファイルをすぐに削除する代わりに名前を変更し、glob 式を使用して、名前が変更されたファイルを含まない入力を定義することができます。上で述べたように、まだ競合状態があります。

  4. Amazon SQS などのキューを使用してアーカイブの配信を記録できます。InputFormat は、入力分割を決定するときにアーカイブ フォルダーを一覧表示するのではなく、これらのエントリをプルできます。しかし、インフラストラクチャを追加しないと、再処理や埋め戻しが問題になります。

  5. つまり、分割のリストは InputFormat によって生成されます。その周りにデコレータを書くと、ジョブが完了した後にマスターが使用したい場所に分割リストをスタッシュできます。

于 2013-09-26T07:06:45.083 に答える
1

最も簡単な方法は、おそらく複数の入力ジョブを実行し、ジョブを実行する前にファイルのディレクトリを読み取り、ディレクトリの代わりにそれらをジョブに渡します (ジョブが完了したら、リスト内のファイルを削除します)。

于 2013-09-26T06:25:42.197 に答える
0

ワークフローを管理するには、 Apache Oozieを使用する必要があると思います。Oozie の Web サイトから (太字は私のものです):

Oozie は、Apache Hadoop ジョブを管理するためのワークフロー スケジューラ システムです。

...

Oozie コーディネーター ジョブは、時間 (頻度) とデータの可用性によってトリガーされる繰り返しの Oozie ワークフロー ジョブです。

于 2013-10-10T19:31:12.400 に答える
0

あなたが説明している状況に基づいて、次の解決策を提案できます。その別のプロセスは、mysql のようなメタデータ テーブルを使用して、ディレクトリの監視に基づいてステータス エントリを配置できます。メタデータ エントリは、重複をチェックすることもできます。2. メタデータ エントリに基づいて、別のプロセスが map reduce ジョブのトリガー部分を処理できるようになりました。ジョブをトリガーするために、一部のステータスをメタデータで確認できます。

于 2013-09-26T17:17:28.263 に答える