2016-10-27 11 views
3

Проблема в том, что она говорит в описании. У меня есть код.Различные выходные данные при запуске mapreduce на локальной машине в IDEA и в 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; 

     } 
    } 

он хорошо работает до редуктора. Потом, когда я запускаю его в intelij идеи (в окнах), я получаю

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 

После того как я пакет кода (я использую 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 

Я использую это для запуска кода.

hadoop jar Project.jar inputPath outputPath 

ответ

1

Похоже, разница вызвана проблемой сравнения частей хранимого ключа (lastCK) и текущего ключ.

меняю бы эту линию:

lastCK = key;

Ключи и значения повторно в Hadoop так, когда это работает на реальном кластере, ваши ключи будут просто быть одинаковыми, так как lastCK и key оба будут тот же объект.

Вы должны либо правильно скопировать key в lastCK, возможно, с использованием метода .set() (что вы пишете, и общая картина в Hadoop) или создать новый, используя конструктор, который принимает CompositeKey.

+0

Я изменил каждый lastCK = ключ на lastCK.setFirst (key.getFirst()); lastCK.setSecond (key.getSecond()); Это не сработало, затем я изменил его на lastCK = новый CompositeKey (key.getFirst(), key.getSecond()); В обоих случаях результат был таким же, как и в начале. –

+0

И какой объект возвращает 'getFirst()' и как работает ваш метод setFirst()? Если его текст, например, и ваш метод set '=', он имеет ту же проблему. –