2016-05-18 7 views
1

Ich lerne, wie man einen map/reduce Job in hadoop mit mongodb Daten als Eingabe schreibt. So folgte ich this Beispiel, aber ich habe folgende Fehlermeldung:Hadoop mit MongoDB: NoClassDefFoundError MongoConfigUtil

Exception in thread "main" java.lang.NoClassDefFoundError: com/mongodb/hadoop/util/MongoConfigUtil 
    at WordCount.main(WordCount.java:58) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
Caused by: java.lang.ClassNotFoundException: com.mongodb.hadoop.util.MongoConfigUtil 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 7 more 

ich ohne Ergebnis stundenlang gesucht habe. Jeder kann mir bitte helfen.

+0

haben Sie versucht -libjars Optionen? Sehen Sie dies als Beispiel https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html –

+0

pom.XML ist nicht sichtbar. Es ist sehr schwer zu verstehen und zu beantworten, was fehlt, wie Sie bereitstellen –

Antwort

1

bedeutet es mongo-hadoop-core.jar ist zur Kompilierzeit verfügbar, aber nicht zur Laufzeit.

Versuchen Sie, Ihre Anwendung mit Abhängigkeits Gläsern hinzugefügt in Classpath laufen

Beispiel: java -cp mongo-hadoop-core.jar<++other dependencies> MainClass

EDIT 1

Wenn Sie mit hadoop Shell

Prüfung der classpath unter Verwendung der Ausführung hadoop classpath wird das Verzeichnis/jars im Klassenpfad gedruckt.

Wenn die abhängigen Gläser sind nicht im Classpath sie in dem Befehl classpath mit export fügen Sie dann hadoop jar yourjar.jar mainClass

EDIT 2

nutzen libjars Option

hadoop jar myjar.jar mainClass -libjars ${LIBJARS}

+0

Das Problem ist, dass in Hadoop sollten wir das Glas aus der Anwendung extrahieren und führen Sie es mit "Hadoop jar name.jar className", so dass ich nicht wissen, wie zu berücksichtigen andere Gläser damit. –

+0

aktualisierte Antwort, überprüfen Sie das – Saravana

1

ausführen Ich kann sehen, diese Link Beispiele Ordner Struktur ist Maven. ICH KANN pom.xml in diesem Link sehen.

Wir setzen Maven Umfang von provided zu runtime

  1. Sie müssen assembly.xml schreiben (Ihre Anwendung lib und damit verbundene Abhängigkeiten in tar-Datei zu verpacken) und von pom.xml beziehen müssen mongo- zu verpacken hadoop-core.jar zusammen mit anderen Abhängigkeiten, die NICHT im Cluster installiert sind.
 
export HADOOP_CLASSPATH=`hadoop classpath`:`hbase classpath` 
hadoop jar .... -cp $HADOOP_CLASSPATH MainClass 

Wenn Sie entpacken Sie die TAR-Datei oben erwähnt, und Sie können die Classpath zum Beispiel verweisen: hadoop jar .... ../lib/* Haupt classs wo lib Ordner contails alle Ihre Abhängigkeiten mögen auch Ihren Mongodb.

  1. Wenn Mongo db und die zugehörigen Komponenten im Cluster installiert werden, können wir den Classpath wie unter Beispiel nennen.

Auch diese Antwort sehen, wie sie libjars verwendet haben