3

重複を含む大量のデバイス データが取り込まれています。取り込まれたメタデータの履歴の別のリストもあります (取り込まれたファイルを一意に識別するため)。取り込んだデバイス データを履歴で重複排除しようとしています。この履歴ファイルは小さくないため、メモリにロードすることは考えていません。私はサイド ジョインの削減も検討しましたが、それはネットワークを介して大量のデータを渡すことになります。

ブルーム フィルターは、履歴ファイルのサイズを縮小するために検討しているものです。しかし、それは私に逆の結果をもたらしています。つまり、重複していないのに重複していると報告することがあります。

重複排除はかなり一般的な問題のようで、他の誰かが考えられるアイデアを探しています。

4

2 に答える 2

4

重複排除に 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());
 }
于 2013-10-16T21:42:45.727 に答える
1

クラスター内の単一のホストにすでに多くの重複があるほど、多数の重複がある場合、コンバイナーがネットワークトラフィックを削減するための唯一の最良の方法であることを忘れないでください。

于 2013-10-16T21:59:30.323 に答える