2

かなり単純なhadoopの質問があり、例を挙げて説明します

文字列のリストと大きなファイルがあり、各マッパーにファイルの一部と文字列の 1 つを grep のようなプログラムで処理させたいとします。

どうやってそれをするのですか?マッパーの数は、生成されたinputSplitsの結果であるという印象を受けています。後続のジョブを文字列ごとに 1 つずつ実行することもできますが、ちょっと…面倒ですよね?

編集:私は実際に grep マップの縮小版を作成しようとしているわけではありません。マッパーへの2つの異なる入力を持つ例として使用しました。A と B をリストしていて、リスト A の 1 つの要素とリスト B の 1 つの要素をマッパーに処理させたいとします。

この問題でジョブの連鎖が必要になるようなデータ依存関係が発生していないことを考えると、すべてのマッパーでリスト A のすべてを何らかの方法で共有し、リスト B の 1 つの要素を各マッパーに入力する唯一のオプションはありますか?

私がやろうとしているのは、データのプレフィックス付きのルックアップ構造を構築することです。だから私は巨大なテキストと文字列のセットを持っています. このプロセスには強力なメモリ ボトルネックがあるため、マッパーごとに 1 チャンクのテキスト/1 文字列が必要でした。

4

3 に答える 3

1

マッパーは、副作用なしで独立して動作できる必要があります。並列性とは、マッパーが行をすべてのパターンと一致させようとすることです。各入力は一度だけ処理されます!

そうしないと、各入力行にパターンの数を掛けることができます。各行を 1 つのパターンで処理します。その後、レデューサーを実行します。AChainMapperは、ここで選択したソリューションです。ただし、覚えておいてください: 2 つのパターンに一致する場合、行は 2 回表示されます。それはあなたが望むものですか?

私の意見では、最初のシナリオを優先する必要があります。各マッパーは行を個別に処理し、すべての既知のパターンに対してチェックします。

ヒント: この機能を使用してパターンDistributedCacheをすべてのマッパーに配布できます! ;-) 入力は InputLineFormat で分割する必要があります

于 2010-04-29T09:28:48.700 に答える
0

編集について:一般に、マッパーを使用して2つの要素を同時に処理することはありません。彼は一度に1つの要素のみを処理するものとします。ジョブは、入力レコードごとにマッパーがあり、それでも正しく実行されるように設計する必要があります。

もちろん、マッパーが入力を処理するためにいくつかのサポート情報を必要とすることは適切です。この情報は、ジョブ構成(Configuration.setString()など)でバイパスできます。より多くのデータセットが分散キャッシュを介して渡されます。

これらのオプションの1つをご覧になりましたか?あなたの問題を完全に理解したかどうかはわかりませんので、それがうまくいくかどうか自分で確認してください;-)

ところで:よく調べた以前の回答に感謝の票を投じればいいでしょう;-)

于 2010-05-03T09:16:53.110 に答える
0

仲の良い友人が素晴らしいひらめきを持っていました。

主に、マッパー (リデューサーなし) を起動するジョブを実行します。入力は文字列のリストであり、各マッパーが 1 つの文字列のみを取得するように配置できます。

次に、最初のマッパーが新しいジョブを開始します。入力はテキストです。コンテキストに変数を設定することにより、文字列を通信できます。

于 2010-05-03T09:26:54.350 に答える