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 から照会することにより、オブジェクト名をタイプに変換します。
私の質問
- これは実行可能ですか?(そしてそれを行う方法は?)
- 懸念事項は何ですか?マッパーが複数のマシンで実行されることを理解しました。
apple
では、複数のマシンに単語があるとしましょうapple
。 - または、マッパーで翻訳を行わない非常に優れた代替手段はありますか? それとも、これを行う一般的な方法がありますか?(または、この質問全体が本当にばかげた質問ですか?)
アップデート
Amazon Elastic MapReduce で Apache Hadoop を使用して実装しており、変換テーブルは Amazon RDS/MySQL に保存されています。サンプルコードまたはリンクを提供していただければ幸いです。