NoClassDefFoundError-Fehler in Hadoop
So, nachdem sich durch viele Beiträge in SO und überarbeitung einige java-Grundlagen bekomme ich noch diesen Fehler
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/io/Writable
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.getMethod0(Class.java:2694)
at java.lang.Class.getMethod(Class.java:1622)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Kenne ich den Unterschied zwischen java.lang.NoClassDefFoundError
und ClassNotFoundException
in Java, und habe mich durch das, was in der Regel verursacht. In einem nutshell, es ist, weil einige Klassen nicht verfügbar ist, um das Programm während der Laufzeit, sondern während der Compile-Zeit. Daher bekomme ich keine compile-Zeit-Fehler.
Ich habe zwei klassenpfade, man commons-logging-1.1.3.jar
und die anderen die hadoop-core.*jar
.
Ich bin ziemlich zuversichtlich, dass die klassenpfade richtig sind.
Hier sind die Einfuhren in meinem Programm
import java.io.*;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.*;
import org.apache.hadoop.io.SequenceFile.Writer;
import org.apache.hadoop.io.*;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.*;
Ich benutze ubuntu 12.04, das ist die Kommandozeile zum kompilieren javac -cp "/home/hduser/hadoop/hadoop-core-1.1.2.jar:/home/hduser/Documents/commons-logging-1.1.3/commons-logging-1.1.3.jar" TSVtoSeq.java Zum Ausführen von java-TSVtoSeq TrainingT1.tsv testOutput 2 Argumente zu main-Input-File und Output-file
Sind Sie nicht die Einstellung Ihres classpath mit
java -cp $JARS
wenn Sie Ihr Programm auszuführen?So, ich habe die klassenpfade bei der Ausführung des Programms(Ist es aber notwendig?), Ich bekomme immer noch die gleiche exception geworfen. Jedoch, die Klasse jetzt wies ist "org/apache/commons/Konfiguration/Konfiguration" statt "org/apache/hadoop/io/Writable"
das ist becoz es gibt viele Gläser hadoop-abhängig ist (kann gefunden werden in HADOOP_HOME/lib) und zur Laufzeit mehrere von denen, die erhalten bezeichnet. Entweder halten tun die manuelle trial-n-error, bis u es läuft oder fügen Sie alle diese jars im classpath befinden, während Sie Sie ausführen. Ein standard-Weg, um erstellen Sie eine jar-Datei mit dem code und führen Sie mit bin/hadoop-script wie beschrieben in meiner Antwort weiter unten.
InformationsquelleAutor SLearner | 2013-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie erstellen eine jar aus dem java-code wie angegeben hier:
Führen Sie die jar so:
Sehen die Dokumentation Seite von hadoop für die Beschreibung der jar-Befehl.
die eine, die ich gab, war für wordcount-Beispiel. dont blind verwenden Sie diesen Befehl. u ersetzen müssen, die Dinge mit Ihrem Klassennamen.
neugierig zu erfahren, ob diese Lösung funktionierte für u
Nein :'( . Bitte Helfen Sie Mit!
ok. könnten Sie diese details: die Befehle, die Sie verwendet, Ihren source-code, der Fehler u got etc.
InformationsquelleAutor Tejas Patil