0

Hadoop で MapReduce を使用するのは初めてです。多くのログ ファイルからエントリを処理しようとしています。マッパーのプロセスは、WordCountチュートリアルのものと非常によく似ています。

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
    String line = value.toString();
    StringTokenizer tokenizer = new StringTokenizer(line);
    while (tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken());
        output.collect(word, one);
    }
}

問題は、リデューサーのキーとして単語を配置する代わりに、RDBMS のテーブルから関連データを配置したいということです。たとえば、加工されたテキストはこのようなものです

apple orange duck apple giraffe horse lion, lion grape

そして、テーブルがあります

name     type
apple    fruit
duck     animal
giraffe  animal
grape    fruit
orange   fruit
lion     animal

ですから、単語を数える代わりに、型を数えたいのです。出力は次のようになります

fruit 4
animal 5

前のコードで言うと、次のようになります

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
    String line = value.toString();
    StringTokenizer tokenizer = new StringTokenizer(line);
    while (tokenizer.hasMoreTokens()) {
        String object = tokenizer.nextToken();
        //========================================
        String type = SomeClass.translate(object);
        //========================================
        word.set(type);
        output.collect(word, one);
    }
}

SomeClass.translate、RDBMS から照会することにより、オブジェクト名をタイプに変換します。

私の質問

  1. これは実行可能ですか?(そしてそれを行う方法は?)
  2. 懸念事項は何ですか?マッパーが複数のマシンで実行されることを理解しました。appleでは、複数のマシンに単語があるとしましょうapple
  3. または、マッパーで翻訳を行わない非常に優れた代替手段はありますか? それとも、これを行う一般的な方法がありますか?(または、この質問全体が本当にばかげた質問ですか?)

アップデート

Amazon Elastic MapReduce で Apache Hadoop を使用して実装しており、変換テーブルは Amazon RDS/MySQL に保存されています。サンプルコードまたはリンクを提供していただければ幸いです。

4

2 に答える 2

1

DBクエリを最小限に抑えることが心配な場合は、2つのMRジョブでこれを行うことができます。最初に標準の単語数を実行し、次にそのジョブの出力を使用して入力への変換を実行し、再合計します。

または、マッピングテーブルがメモリに収まるほど小さい場合は、シリアル化してDistributedCacheに追加し、マッパーのセットアップメソッドの一部としてメモリにロードすることから始めることができます。そうすれば、それはただの安価なメモリルックアップであるため、翻訳を何度も行うことを心配する必要はありません。

于 2013-01-11T18:43:54.020 に答える
1

要件を要約すると、テーブル内のデータとファイルの間で結合が行われ、結合されたデータに対してカウントが行われます。データの入力サイズに基づいて、さまざまな方法 (M または MR のみ) で結合を行うことができます。結合の詳細については、MapReduce を使用したデータ集約型テキスト処理- セクション 3.5 を参照してください。

于 2013-01-11T16:35:32.657 に答える