2016-10-27 1 views
3

問題は説明に記載されています。私はいくつかのコードを持っています。IDEAのローカルマシンでmapreduceを実行しているときとクラスタでhadoopを実行しているときの出力が異なります

これは還元剤です。

public class RTopLoc extends Reducer<CompositeKey, IntWritable, Text, Text> { 
    private static int number = 0; 
    private static CompositeKey lastCK = new CompositeKey(); 
    private static Text lastLac = new Text(); 

    @Override 
    public void reduce(CompositeKey key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
     int sum = sumValues(values); 
     String str = Integer.toString(sum); 
     String str2 = Integer.toString(number); 
     String str3 = key.getSecond().toString(); 
     context.write(key.getFirst(), new Text(str3 + " " + str2 + " " + str)); 
     if(number == 0){ 
      number = sum; 
      lastCK = key; 
      context.write(new Text("1"), new Text("1")); 
     } 
     else if(lastCK.getFirst().equals(key.getFirst()) && sum > number){ 
      lastCK = key; 
      context.write(new Text("2"), new Text("2")); 
     } 
     else if(!lastCK.getFirst().equals(key.getFirst())){ 
//   context.write(lastCK.getFirst(), lastCK.getSecond()); 
      context.write(new Text("3"), new Text("3")); 
      number = sum; 
      lastCK = key; 

     } 
    } 

還元剤までは正常に動作します。私は(Windowsの場合)intelijアイデアでそれを実行すると、その後、私は、コードをパッケージ(私はMavenを使用)し、Hadoopの(Linux)の上でそれを実行した後、私は

0000000000 44137 0 2 
1 1 
902996760100000 44137 2 6 
2 2 
9029967602 44137 2 8 
2 2 
90299676030000 44137 2 1 
9029967604 44137 2 5 
2 2 
905000 38704 2 1 
9050000001 38702 2 24 
2 2 
9050000001 38704 2 14 
2 2 
9050000001 38705 2 12 
2 2 
9050000001 38706 2 13 
2 2 
9050000001 38714 2 24 
2 2 
9050000002 38704 2 12 
2 2 
9050000002 38706 2 12 
2 2 
9050000011 38704 2 6 
2 2 
9050000011 38706 2 12 
2 2 
9050000021 38702 2 12 
2 2 
9050000031 38704 2 6 
2 2 
9050000031 38705 2 6 
2 2 
9050000031 38714 2 12 
2 2 
を取得

0000000000 44137 0 2 
1 1 
902996760100000 44137 2 6 
3 3 
9029967602 44137 6 8 
3 3 
90299676030000 44137 8 1 
3 3 
9029967604 44137 1 5 
3 3 
905000 38704 5 1 
3 3 
9050000001 38702 1 24 
3 3 
9050000001 38704 24 14 
9050000001 38705 24 12 
9050000001 38706 24 13 
9050000001 38714 24 24 
9050000002 38704 24 12 
3 3 
9050000002 38706 12 12 
9050000011 38704 12 6 
3 3 
9050000011 38706 6 12 
2 2 
9050000021 38702 6 12 
3 3 
9050000031 38704 12 6 
3 3 
9050000031 38705 6 6 
9050000031 38714 6 12 
2 2 

を取得します

私はこれを使ってコードを実行します。

hadoop jar Project.jar inputPath outputPath 

答えて

1

違いは、保存されているキー(lastCK)と現在のキーの部分を比較して問題が発生しているようです。

私はこの行を変更します

lastCK = key;

キーと値は、Hadoopの中で再利用され、これは本当のクラスタ上で実行されているときに、あなたの鍵はちょうどlastCKkeyので、同じになります両方になります同じオブジェクト。

は、次のいずれかの適切おそらく(あなたが書くとHadoopの中に一般的なパターンであること) .set()メソッドを使用して、 lastCKkeyをコピーしたり、 CompositeKey受け取るコンストラクタを使用して新しいものを作成する必要があります。

+0

私はすべてのlastCK =キーをlastCK.setFirst(key.getFirst())に変更しました。 lastCK.setSecond(key.getSecond());それは動作しなかった、私はそれをlastCK = new CompositeKey(key.getFirst()、key.getSecond())に変更しました。どちらの場合も、結果は最初と同じでした。 –

+0

'getFirst()'が返すオブジェクトの種類と、 'setFirst()'メソッドはどのように機能しますか?例えば、Textやsetメソッドが '='を実行しても同じ問題を抱えています。 –

関連する問題