2014-10-01 2 views
6

Ich führe ein Test HBase Java-Programm über Oozie Java-Aktion. Der folgende Fehler auftritt:Oozie Java Aktion: Passing Hbase Classpath

Failing Oozie Launcher, Main class [HbaseTest], main() threw exception, org/apache/hadoop/hbase/HBaseConfiguration 
java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration 
at HbaseTest.main(HbaseTest.java:28) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:495) 
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:417) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:332) 
at org.apache.hadoop.mapred.Child$4.run(Child.java:268) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:396) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1438) 
at org.apache.hadoop.mapred.Child.main(Child.java:262) 
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.HBaseConfiguration 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
... 14 more 

Das Programm läuft korrekt von der Kommandozeile:

java -cp `hbase classpath` HbaseTest 

Gibt es eine Weise, die ich Ausgabe von ‚hbase Classpath‘ zum Oozie java Aktion passieren kann. Ich möchte nicht HBase-Dateien in das lib-Verzeichnis des Arbeitsablaufs kopieren, da dies einen Wartungsaufwand darstellt.

Im Anschluss ist die Java-Aktion von workflow.xml:

<java> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <configuration> 
      <property> 
       <name>mapred.job.queue.name</name> 
       <value>${queueName}</value> 
      </property> 
     </configuration> 
     <main-class>HbaseTest</main-class> 
     <java-opts></java-opts> 
     <arg>HELLO</arg> 
    </java> 

Antwort

3

Seit Oozie 2.3 Sie teilen Bibliotheken verwenden können:

Oozie unterstützt Job- und Systemfreigabebibliotheken für Workflow-Arbeitsplätze.

Freigabebibliotheken können die Bereitstellung und Verwaltung gemeinsamer Komponenten für alle Workflowanwendungen vereinfachen.

Wenn ein Workflow-Job beispielsweise eine Share-Bibliothek mit den Har-JARs-Dateien Streaming, Pig & verwendet, muss er diese JAR-Dateien nicht in der Workflow-Anwendung lib/path bündeln.

Wenn der Workflowjob eine Share-Bibliothek verwendet, fügt Oozie alle JAR/SO-Dateien in die Bibliothek im Klassenpfad/libpath für alle seine Aktionen ein.

Ein Arbeitsablaufjob kann mithilfe der Jobeigenschaft oozie.libpath einen Pfad für die Freigabebibliothek angeben.

Ein Workflowjob kann die Systemfreigabebibliothek verwenden, indem er die Jobeigenschaft oozie.use.system.libpath auf true setzt.

http://oozie.apache.org/docs/3.2.0-incubating/WorkflowFunctionalSpec.html#a17_HDFS_Share_Libraries_for_Workflow_Applications_since_Oozie_2.3

Wie installieren: http://oozie.apache.org/docs/4.0.0/DG_QuickStart.html#OozieShareLib