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.*;
Diese Klasse ist in den hadoop-core-jar, können Sie schreiben genau, wie Sie Ihre Arbeit (einschließlich der classpath)?
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

Schreibe einen Kommentar