2

あるファイルから単語を読み取り、別のファイルを検索できる Hadoop アプリケーションを構築したいと考えています。

単語が存在する場合 - 1 つの出力ファイルに書き込む必要がある単語が存在しない場合 - 別の出力ファイルに書き込む必要がある

Hadoop でいくつかの例を試しました。2つの質問があります

2 つのファイルはそれぞれ約 200 MB です。別のファイルのすべての単語をチェックすると、メモリ不足が発生する可能性があります。これを行う別の方法はありますか?

Hadoop の reduce フェーズの出力は 1 つのファイルにしか書き込まれないため、異なるファイルにデータを書き込む方法。データを異なる出力ファイルに書き込むために、reduce フェーズのフィルターを使用することは可能ですか?

ありがとうございました。

4

3 に答える 3

8

どのように私はそれを行うだろう:

  1. 「マップ」の値を単語で分割し、(<単語>, <ソース>) を出力 (*1)
  2. 'reduce': (<単語>, <ソースのリスト>)
  3. source-list を確認してください (両方/すべてのソースでは長くなる可能性があります)
  4. すべてのソースがリストにない場合は、毎回発行します (<missingsource>, <word>)
  5. job2: job.setNumReduceTasks(<ソース数>)
  6. job2: 'map' で出力 (<missingsource>, <word>)
  7. job2: 'reduce' all (null, <word>) の <missingsource> ごとに出力

それぞれがドキュメントの欠落した単語を含む、さまざまな <missingsources> と同数の reduce-outputs になることになります。ファイルをマークするために、「reduce」の先頭に <missingsource> ONCE を書き出すことができます。

(*1) 地図で出典を調べる方法 (0.20):

private String localname;
private Text outkey = new Text();   
private Text outvalue = new Text();
...
public void setup(Context context) throws InterruptedException, IOException {
    super.setup(context);

    localname = ((FileSplit)context.getInputSplit()).getPath().toString();
}

public void map(Object key, Text value, Context context)
    throws IOException, InterruptedException {
...
    outkey.set(...);
    outvalue.set(localname);
    context.write(outkey, outvalue);
}
于 2010-01-25T09:43:24.767 に答える
1

この問題を解決するために特定の理由で Hadoop/MapReduce を使用していますか? これは、Hadoop よりもLuceneベースのアプリケーションに適しているように思えます。

Hadoop を使用する必要がある場合は、いくつかの提案があります。

  1. 「ドキュメント」は、MapReduce が処理できる形式である必要があります。使用する最も簡単な形式は、ドキュメント内の各単語を 1 行に含む CSV ベースのファイルです。PDFなどを持っているとうまくいきません。

  2. 一連の単語を MapReduce ジョブへの入力として取得し、MapReduce が処理するデータと比較するには、分散キャッシュを使用して、各マッパーが入力で検索する一連の単語を作成できるようにします。ただし、それを見つけるための単語のリストが大きい場合(200MBと言及している場合)、これが機能するとは思えません。ただし、このメソッドは、MapReduce で結合を行うための主な方法の 1 つです。

ここの別の回答で言及されているインデックス作成方法も可能性を提供します。繰り返しになりますが、ドキュメントのインデックス作成という用語は、Hadoop ではなく Lucene を思い起こさせます。この方法を使用した場合は、キー値に単語だけでなくドキュメント識別子も含まれていることを確認して、各ドキュメントに含まれる単語数を取得する必要があります。

MapReduce ジョブから複数の出力ファイルを生成したことはないと思います。索引付けされた出力を複数のファイルに処理するには、いくつかの (非常に単純な) コードを作成する必要があります。

于 2010-01-24T23:06:42.993 に答える
0

私の意見では、これを 2 段階で行う必要があります。2 つの初期ドキュメントに対して wordcount プログラム (hadoop のサンプル jar に含まれています) を実行します。これにより、各ドキュメント内の単語の一意のリスト (カウント付き) を含む 2 つのファイルが得られます。そこから、hadoop を使用するのではなく、質問に答える 2 つのファイルで簡単な diff を実行します。

于 2010-01-24T18:39:57.317 に答える