2014-11-05 7 views
5

Ich versuche, externe Jars auf Hadoop Classpath zu setzen, aber bisher kein Glück.Einstellung externer Jars auf den Hadoop Classpath

Ich habe folgendes Setup

$ hadoop version
Hadoop 2.0.6-alpha Subversion https://git-wip-us.apache.org/repos/asf/bigtop.git -r ca4c88898f95aaab3fd85b5e9c194ffd647c2109 Compiled by jenkins on 2013-10-31T07:55Z From source with checksum 95e88b2a9589fa69d6d5c1dbd48d4e This command was run using /usr/lib/hadoop/hadoop-common-2.0.6-alpha.jar

Classpath

$ echo $HADOOP_CLASSPATH
/home/tom/workspace/libs/opencsv-2.3.jar

Ich bin in der Lage die oben HADOOP_CLASSPATH sehen wurde von hadoop

$ hadoop classpath
/etc/hadoop/conf:/usr/lib/hadoop/lib/:/usr/lib/hadoop/.//:/home/tom/workspace/libs/opencsv-2.3.jar:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/:/usr/lib/hadoop-hdfs/.//:/usr/lib/hadoop-yarn/lib/:/usr/lib/hadoop-yarn/.//:/usr/lib/hadoop-mapreduce/lib/:/usr/lib/hadoop-mapreduce/.//

Befehl

$ sudo hadoop jar FlightsByCarrier.jar FlightsByCarrier /user/root/1987.csv /user/root/result

aufgenommen

Ich habe versucht, mit -libjars Option als auch

$ sudo hadoop jar FlightsByCarrier.jar FlightsByCarrier /user/root/1987.csv /user/root/result -libjars /home/tom/workspace/libs/opencsv-2.3.jar

stacktrace

14/11/04 16:43:23 INFO mapreduce.Job: Running job: job_1415115532989_0001 14/11/04 16:43:55 INFO mapreduce.Job: Job job_1415115532989_0001 running in uber mode : false 14/11/04 16:43:56 INFO mapreduce.Job: map 0% reduce 0% 14/11/04 16:45:27 INFO mapreduce.Job: map 50% reduce 0% 14/11/04 16:45:27 INFO mapreduce.Job: Task Id : attempt_1415115532989_0001_m_000001_0, Status : FAILED Error: java.lang.ClassNotFoundException: au.com.bytecode.opencsv.CSVParser at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at FlightsByCarrierMapper.map(FlightsByCarrierMapper.java:19) at FlightsByCarrierMapper.map(FlightsByCarrierMapper.java:10) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:757) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:158) 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:1478) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:153)

Jede Hilfe sehr geschätzt wird.

+0

Versuchen Sie Folgendes: sudo hadoop jar FlightsByCarrier.jar FlightsByCarrier -libjars /home/tom/workspace/libs/opencsv-2.3.jar /user/root/1987.csv/user/root/result –

+0

Überprüfen Sie meine Antwort hier, ich habe alle verfügbaren Optionen erklärt, um dieses Problem hier zu beheben: stackoverflow.com/a/36227260/1766402 – Isaiah4110

Antwort

3

Ihr externes Glas fehlt auf dem Knoten, auf dem Karten ausgeführt werden. Sie müssen es dem Cache hinzufügen, um es verfügbar zu machen. Versuchen:

DistributedCache.addFileToClassPath(new Path("pathToJar"), conf); 

Nicht sicher, in der Version DistributedCache wurde als veraltet, aber von Hadoop 2.2.0 Weiter können Sie:

job.addFileToClassPath(new Path("pathToJar")); 
+0

Danke, es hat funktioniert. – mnm

+0

Ich hielt ein Glas in HDFS mit .. hadoop fs -put java-json.jar /user/root/jars/java-json.jar ... In meiner Klasse habe ich job.addFileToClassPath (neuer Pfad ("/ Benutzer /root/jars/java-json.jar ")); Aber während Job läuft NoClassDefFoundError bekomme ich etwas fehlt? –

+0

Ich versuchte das gleiche 'job.addFileToClassPath (neuer Pfad (" pathToJar ")); 'und gegebener Pfad meiner HDFS-Datei.Und ich habe versucht, der Datei 777 Berechtigungen zu geben, aber immer noch nicht in der Lage, dies zu lösen. Kannst du mir bitte dabei helfen? – Manindar

0

fand ich eine andere Abhilfe durch ToolRunner Umsetzung wie unten. Mit diesem Ansatz akzeptiert hadoop Befehlszeilenoptionen. Wir können

harte Codierung von Dateien hinzufügen DistributedCache vermeiden
public class FlightsByCarrier extends Configured implements Tool { 

     public int run(String[] args) throws Exception { 
     // Configuration processed by ToolRunner 
     Configuration conf = getConf(); 

     // Create a JobConf using the processed conf 
     JobConf job = new JobConf(conf, FlightsByCarrier.class); 

     // Process custom command-line options 
     Path in = new Path(args[1]); 
     Path out = new Path(args[2]); 

     // Specify various job-specific parameters  
     job.setJobName("my-app"); 
     job.setInputPath(in); 
     job.setOutputPath(out); 
     job.setMapperClass(MyMapper.class); 
     job.setReducerClass(MyReducer.class); 

     // Submit the job, then poll for progress until the job is complete 
     JobClient.runJob(job); 
     return 0; 
     } 

     public static void main(String[] args) throws Exception { 
     // Let ToolRunner handle generic command-line options 
     int res = ToolRunner.run(new Configuration(), new FlightsByCarrier(), args); 

     System.exit(res); 
     } 
    } 
0

Ich habe eine sehr einfache Lösung für das Problem gefunden: Login als root:

cd /usr/lib find . -name "opencsv.jar"

die locatin der Datei aufnehmen. In meinem Fall> fand ich es unter /usr/lib/hive/lib/opencsv*.jar

nun den Befehl senden

hadoop classpath

Das Ergebnis zeigt die direcory wo hadoop jar-Dateien durchsucht. Nehmen Sie ein Verzeichnis auf und kopieren Sie opencsv * jar in dieses Verzeichnis.

In meinem Fall hat es funktioniert.

1

Wenn Sie dem Hadoop-Klassenpfad die externe JAR hinzufügen, ist es besser, Ihre JAR in eines der vorhandenen Verzeichnisse zu kopieren, die von Hadoop betrachtet werden. Führen Sie in der Befehlszeile den Befehl "hadoop classpath" aus und suchen Sie dann einen geeigneten Ordner und kopieren Sie Ihre JAR-Datei an diesen Speicherort, und hadoop wird die Abhängigkeiten von dort abholen. Dies funktioniert nicht mit CloudEra usw., da Sie möglicherweise keine Lese-/Schreibrechte haben, um Dateien in die Klassenpfadordner von hadoop zu kopieren.

Sieht so aus, als hätten Sie auch die Option LIBJARs versucht. Haben Sie Ihre Treiberklasse bearbeitet, um die TOOL-Schnittstelle zu implementieren?Stellen Sie zunächst sicher, dass Sie Ihre Treiber-Klasse bearbeiten, wie unten dargestellt:

public class myDriverClass extends Configured implements Tool { 

     public static void main(String[] args) throws Exception { 
     int res = ToolRunner.run(new Configuration(), new myDriverClass(), args); 
     System.exit(res); 
     } 

     public int run(String[] args) throws Exception 
     { 

     // Configuration processed by ToolRunner 
     Configuration conf = getConf(); 
     Job job = new Job(conf, "My Job"); 

     ... 
     ... 

     return job.waitForCompletion(true) ? 0 : 1; 
     } 
    } 

jetzt Ihren „hadoop jar“ Befehl bearbeiten, wie unten dargestellt:

hadoop jar YourApplication.jar [myDriverClass] args -libjars path/to/jar/file 

kann nun verstehen, was darunter passiert. Grundsätzlich behandeln wir die neuen Befehlszeilenargumente, indem wir TOOL Interface implementieren. ToolRunner wird zum Ausführen von Klassen verwendet, die die Tool-Schnittstelle implementieren. Es funktioniert in Verbindung mit GenericOptionsParser, um die generischen Hadoop-Befehlszeilenargumente zu analysieren und die Konfiguration des Tools zu ändern.

Im Rahmen unseres Main() wir ToolRunner.run(new Configuration(), new myDriverClass(), args) fordern - diese läuft das angegebene Tool von Tool.run (String []), nach mit den angegebenen generischen Argumenten Parsen. Es verwendet die angegebene Konfiguration oder erstellt eine, wenn es null ist, und legt dann die Konfiguration des Tools mit der möglicherweise modifizierten Version des Conf fest.

Jetzt innerhalb der run-Methode, wenn wir getConf() aufrufen, erhalten wir die modifizierte Version der Konfiguration. So stellen Sie sicher, dass Sie die untere Zeile in Ihrem Code haben. Wenn Sie alles andere implementieren und weiterhin Configuration conf = new Configuration() verwenden, würde nichts funktionieren.

Configuration conf = getConf(); 
2

Ich versuchte, das opencsv Glas in der hadoop Classpath Einstellung, aber es hat nicht brauchen work.We ausdrücklich das Glas in dem Classpath dafür work.It für mich habe gearbeitet zu kopieren. Im Folgenden sind die Schritte i gefolgt:

ich dies in einem HDP CLuster.I getan haben Åhave mein opencsv Glas in hbase Libs kopiert und exportiert es vor meinem Glas

Kopieren ExternalJars zu HDP LIBS ausgeführt wird:

öffnen CSV jar To Run: 1.Kopieren das opencsv Glas im Verzeichnis /usr/hdp/2.2.9.1-11/hbase/lib/ und /usr/hdp/2.2.9.1-11/hadoop-yarn/lib

**sudo cp /home/sshuser/Amedisys/lib/opencsv-3.7.jar /usr/hdp/2.2.9.1-11/hbase/lib/** 

2.Give die Berechtigungen Datei sudo chmod 777 opencsv-3.7.jar 3.List Dateien ls -lrt

4. Export hadoop classpath mit: hbase classpath

5. Führen Sie jetzt Ihr Jar aus. Es wird das opencsv jar aufnehmen und ordnungsgemäß ausgeführt.