重複排除に Map/Reduce を使用し、タスクに複数のマシンを使用する場合は、すべてのデータをネットワーク経由で送信する必要があります。それが Hadoop の機能です。
もちろん、1 台のマシンですべてを実行することもできますが、時間がかかります。本質的に、重複排除は Hadoop が自然に行うことの 1 つであり、ほとんどの機能を無料で利用できます。Hadoop は Map ステップですべての「キー」をハッシュし、「キー」に属するすべての「値」が最終的に同じリデューサー。
タスク自体はかなり単純で、実際にはWordCountの例 (最も単純な Map/Reduce ジョブの 1 つ)とほとんど同じです。カウントの出力をスキップして、キーのみを出力します (値にはNullWritableを使用します)。以下に map 関数と reduce 関数を含めました。注: Reducer に N 個の複数のマシンを使用している場合は、各 Reducer からの結果の N 個の出力ファイルを連結して、単一のファイルを取得する必要があります。コードは次のとおりです。
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString(); //process your data here
context.write(line, NullWritable.get());
}
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
context.write(key, NullWritable.get());
}
編集1:他の回答で提案されているようにコンバイナーを使用したい場合は、非常に簡単に行うことができます。コンバイナーは、データがネットワーク経由で送信される前に実行されます。ローカルのリデューサーと考えることができます。設定するだけ
job.setCombinerClass(Reduce.class);
ここで、Reduce は reduce() メソッドを含むクラスです。
編集2:私が受け取った提案によると:value.toString()
処理する文字列しかなく、処理をまったく行う必要がない場合、これは不要であり、必要ありません。Mapper
次に、少し単純化できます。
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
context.write(value, NullWritable.get());
}