2016-08-21 6 views
0

Ich stelle eine sehr initiale Programmieraufgabe mit hadoop zusammen und gehe mit dem klassischen Wordcount-Problem.Reduzierung bei 70% stecken

Legen Sie eine Beispieldatei auf hdfs und versucht, Wordcount darauf auszuführen. Der Mapper geht gut durch, der Reducer bleibt jedoch bei 70% hängen und bewegt sich nie vorwärts.

Ich versuchte dies mit Dateien auf dem lokalen Dateisystem auch und bekam das gleiche Verhalten.

Was könnte ich falsch machen? hier Karte und reduzieren Funktionen -

public void map(LongWritable key, Text value, 
     OutputCollector<Text, IntWritable> output, Reporter reporter) 
     throws IOException { 
    // TODO Auto-generated method stub 
    String line = value.toString(); 

    String[] lineparts = line.split(","); 

    for(int i=0; i<lineparts.length; ++i) 
    { 
     output.collect(new Text(lineparts[i]), new IntWritable(1)); 
    } 


public void reduce(Text key, Iterator<IntWritable> values, 
       OutputCollector<Text, IntWritable> output, Reporter reporter) 
      throws IOException { 
     // TODO Auto-generated method stub 
     int count = 0; 
     while(values.hasNext()) 
     { 
      count=count+1; 
     } 
     output.collect(key , new IntWritable(count)); 
    } 

Antwort

3

Sie nie next() auf Ihrem Iterator nennen, so dass Sie im Grunde eine Endlosschleife zu schaffen.


Als Randbemerkung, die bevorzugte Art und Weise, dieses Wort zu zählen Beispiel zu implementieren, ist nicht die Zählung von 1, zu erhöhen, aber den Wert verwenden, anstatt:

IntWritable value = values.next(); 
count += value.get(); 

Auf diese Weise können Sie wieder verwenden Ihre Reducer als Combiner, so dass es Teilzählungen für jeden Mapper berechnet und (7) anstelle von 7 Vorkommen von ("wordX", 1) von einem gegebenen Mapper (7) an den Reduzierer emittiert. Sie können mehr über Combiner here lesen.

+0

Perfekt, danke für den schnellen Fund des Bugs. – Gyan