2016-04-22 8 views
0

i map.java Klasse ich versuche, die Dateinamen zu senden dieseFehler: java.lang.NullPointerException Fehler für Karte reduzieren Programm

context.write (neuer Text (stringWord), neuer Text (Dateiname))

recude.java

import java.io.IOException; 

import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapreduce.*; 

public class Reduce extends Reducer<Text, Text, Text, Text> { 

@Override 
public void reduce(Text key, Iterable<Text> values, Context context) 
throws IOException, InterruptedException { 
    int sum = 0; 
    MapWritable occurenceInFile = new MapWritable(); 
    for (Text val : values) { 
     if(occurenceInFile.containsKey(val)) { 
      occurenceInFile.put(val, new IntWritable(1)); 
     } else { 
      IntWritable occurence = (IntWritable) occurenceInFile.get(val); 
      occurenceInFile.put(val, new IntWritable(occurence.get() + 1)); 
     } 
     sum += 1; 
    } 
    String result = key.toString() + " ("; 
    boolean flag = false; 
    for (Writable filenameWritable : occurenceInFile.keySet()) { 
     if (flag) { 
      result += ", "; 
     } 
     String filename = ((Text) filenameWritable).toString(); 
     result += filename + "=" + ((IntWritable) occurenceInFile.get(filenameWritable)).toString(); 
     flag = true; 
    } 
    result += ")\nTotal occurence of \"" + key + "\": " + Integer.toString(sum); 

    context.write(key, new Text(result)); 
} 
} 

Fehlercode dieser Fehlercode Show in stderr

Error: java.lang.NullPointerException 
at Reduce.reduce(Reduce.java:18) 
at Reduce.reduce(Reduce.java:6) 
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:180) 
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:656) 
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:394) 
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:172) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:415) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:166) 

i BEGI Ich schreibe ein Wordcount-Programm, aber ich weiß immer noch nicht, wie ich diesen Fehler beheben kann.

+1

Schauen Sie sich die Zeilen 6 und 18 in Ihrem Code an. Dies ist ein Wortzählprogramm? Sieht unordentlich aus. Ich bin mir sicher, dass es möglich ist, etwas saubereres zu schreiben. – duffymo

+0

ja das ist nicht das ganze Programm, aber ich denke, es gibt keinen Fehler in meinem map.java und wordcount.java (Hauptklasse) –

+0

Sie dachten falsch. Es gibt einen Fehler. Die JVM hat es gerade klargestellt. Ich bin sicher, das könnte und sollte deutlicher geschrieben werden. Ich würde eine JDK8-basierte Version empfehlen, bevor Sie es mit Hadoop ausprobieren. Wenn du das nicht kannst, hast du mit dem großen Hammer wenig Chancen. Mach zuerst etwas Einfaches. – duffymo

Antwort

0

Ich denke, Zeilennummer # 18 ist diese:

occurenceInFile.put(val, new IntWritable(occurence.get() + 1));

so ist es möglich, dass occurence Variablenwert, der auf der vorherigen Zeile gelesen wird, null ist. Eine andere Variante ist, dass occurence.get() Wert null ist.

Also, es ist schwer zu sagen, was genau es verursachen kann, aber Sie sollten Ihr Programm debuggen und finden, warum occurenceInFile.get(val);null Wert zurückgeben kann.

Verwandte Themen