2014-10-01 25 views
6

Sto eseguendo un programma hbase java di prova tramite l'azione oozie java. è verificato il seguente errore:Oozie Java Azione: passaggio del classpath Hbase

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 

Il programma viene eseguito correttamente da linea di comando:

java -cp `hbase classpath` HbaseTest 

c'è un modo posso passare uscita di 'HBase classpath' all'azione oozie Java. Non voglio copiare i jar di hbase nella directory lib del flusso di lavoro poiché ciò sarà un sovraccarico di manutenzione.

Di seguito è riportato l'azione Java da 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> 

risposta

3

Dal Oozie 2.3 è possibile utilizzare Share Biblioteche:

Oozie sostiene di posti di lavoro e di sistema librerie di condivisione per i lavori del flusso di lavoro.

Le librerie di condivisione possono semplificare l'implementazione e la gestione di componenti comuni tra le applicazioni del flusso di lavoro.

Ad esempio, se un lavoro del flusso di lavoro utilizza una libreria di condivisione con i file Streaming, Pig & Har JARs, non deve raggruppare quei file JAR nel percorso lib/path dell'applicazione di lavoro.

Se il lavoro del flusso di lavoro utilizza una libreria di condivisione, Oozie includerà tutti i file JAR/SO nella libreria nel classpath/libpath per tutte le sue azioni.

Un processo del flusso di lavoro può specificare un percorso della libreria di condivisione utilizzando la proprietà del lavoro oozie.libpath.

Un processo di flusso di lavoro può utilizzare la libreria di condivisione del sistema impostando la proprietà del lavoro oozie.use.system.libpath su true.

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

Come installare: http://oozie.apache.org/docs/4.0.0/DG_QuickStart.html#OozieShareLib