1

私は現在、入力データが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を使用しようとすると、正確な局所性を確保する必要があります。一部のディレクトリを繰り返し読み取り、他のディレクトリはまったく読み取らない。

どんな助けでも大歓迎です。

4

1 に答える 1

0

私はあなたがそれをすることができる3つの方法があると思います。

1.)データをHDFSにロードするだけですが、これは実行したくありません。ただし、将来の処理に役立つため、試す価値があります。

2.)NLineInputFormatを利用できます。各ノードの入力ファイルのURLを使用して4つの異なるファイルを作成します。

file://192.168.2.3/usr/rags/data/DFile1.xyz
.......

これらのファイルをHDFSにロードし、これらのファイルにプログラムを記述して、これらのURLを使用してデータデータにアクセスし、データを処理します。1行でNLineInputFormatを使用する場合。16個のマッパーを処理し、各マップは専用ファイルを処理します。ここでの唯一の問題は、あるノードのデータが別のノードで処理される可能性が高いですが、重複した処理はありません。

3.)上記の4つのファイルをURLとともに個別にロードすることにより、上記の方法をさらに最適化できます。これらのファイルのいずれかをロードしているときに、他の3つのノードを削除して、データファイルがローカルに存在するノードにファイルが正確に移動するようにすることができます。ロード中に、ブロックが複製されないように複製を1として選択します。このプロセスにより、起動されたマップがローカルファイルを処理する可能性が非常に高くなります。

乾杯ラグ

于 2013-03-27T12:55:39.750 に答える