私は現在、入力データがHDFSになく、HDFSにロードできないマップリデュースジョブを作成しようとしています。これは、データを使用するプログラムがHDFSからのデータを使用できず、少なくともHDFSにコピーするには多すぎるためです。ノードあたり1TB。
したがって、クラスター内の4つのノードのそれぞれに4つのディレクトリがあります。理想的には、マッパーがこれら4つのローカルディレクトリのパスを受け取り、file:/// var / mydata / ...のようなものを使用してそれらを読み取るようにします。そうすれば、1つのマッパーが各ディレクトリで機能します。つまり、合計16個のマッパー。
ただし、これを実行できるようにするには、ノードごとに正確に4つのマッパーと、そのマシンにローカルなパスが割り当てられている正確に4つのマッパーを取得する必要があります。これらのパスは静的であるため、fileinputformatとrecordreaderにハードコーディングできますが、特定の分割が既知のホスト名を持つ特定のノードで終了することを保証するにはどうすればよいですか。それがHDFSにある場合、FileInputFormat設定のバリアントisSplittableをfalseに使用でき、hadoopがそれを処理しますが、すべてのデータがローカルであるため、これにより問題が発生します。
基本的に私が望むのは、クラスター内のすべてのノードのローカルディレクトリ構造を1回だけクロールし、これらのディレクトリ内のSSTableのコレクションを処理し、(マッパー上で)行を出力し、結果を(reduceステップで)reduceできるようにすることです。さらなるバルク処理のためのHDFS。
inputSplitsがgetLocations関数を提供していることに気付きましたが、これは実行の局所性を保証するものではなく、最適化するだけであり、各マッパーでfile:/// some_pathを使用しようとすると、正確な局所性を確保する必要があります。一部のディレクトリを繰り返し読み取り、他のディレクトリはまったく読み取らない。
どんな助けでも大歓迎です。