如何将Jar文件传递给OOZIE shell节点中的shell脚本

嗨我在脚本中运行java程序时遇到错误,该脚本正在oozie shell action workflow中执行。

Stdoutput 2015-08-25 03:36:02,636 INFO [pool-1-thread-1] (ProcessExecute.java:68) - Exception in thread "main" java.io.IOException: Error opening job jar: /tmp/jars/first.jar Stdoutput 2015-08-25 03:36:02,636 INFO [pool-1-thread-1] (ProcessExecute.java:68) - at org.apache.hadoop.util.RunJar.main(RunJar.java:124) Stdoutput 2015-08-25 03:36:02,636 INFO [pool-1-thread-1] (ProcessExecute.java:68) - Caused by: java.io.FileNotFoundException: /tmp/jars/first.jar (No such file or directory) Stdoutput 2015-08-25 03:36:02,636 INFO [pool-1-thread-1] (ProcessExecute.java:68) - at java.util.zip.ZipFile.open(Native Method) Stdoutput 2015-08-25 03:36:02,637 INFO [pool-1-thread-1] (ProcessExecute.java:68) - at java.util.zip.ZipFile.(ZipFile.java:215) Stdoutput 2015-08-25 03:36:02,637 INFO [pool-1-thread-1] (ProcessExecute.java:68) - at java.util.zip.ZipFile.(ZipFile.java:145) Stdoutput 2015-08-25 03:36:02,637 INFO [pool-1-thread-1] (ProcessExecute.java:68) - at java.util.jar.JarFile.(JarFile.java:154) Stdoutput 2015-08-25 03:36:02,637 INFO [pool-1-thread-1] (ProcessExecute.java:68) - at java.util.jar.JarFile.(JarFile.java:91) Stdoutput 2015-08-25 03:36:02,640 INFO [pool-1-thread-1] (ProcessExecute.java:68) - at org.apache.hadoop.util.RunJar.main(RunJar.java:122) Exit code of the Shell command 1 

以下是文件详细信息:

job.properties:

 nameNode=maprfs:/// jobTracker=maprfs:/// queueName=nitin EXEC=execution.jar ozie.libpath=${nameNode}/user/oozie/share/lib oozie.use.system.libpath=true oozie.wf.application.path=maprfs:/dev/user/oozieTest 

workflow.xml

      ${jobTracker} ${nameNode}   mapred.job.queue.name ${queueName}   script -type mine -cfg config.cfg script ${EXEC}#${EXEC} config.cfg first.jar#first.jar second.jar#second.jar      Workflow failed, error message[${wf:errorMessage(wf:lastErrorNode())}]    

脚本:

 #!/bin/bash #get the user who executed the script EXECUTING_USER="user1" # get start time NOW=$(date +"%T") #get the host name HOST="$HOSTNAME" ARGUMENTSTRING="$@ -user user1 -startTime $NOW" echo "Passing the following arguments : $ARGUMENTSTRING" java -cp execution.jar com.hadoop.test.Main "$ARGUMENTSTRING" exit $? 

我从/ tmp / jars目录中的execution.jar文件中获取first.jar,原因是此目录不会向oozie工作流用户创建任何权限问题。

任何方向/建议都会非常有帮助。

我在坚果壳中的问题:

  • 我想在oozie shell动作节点中执行一个脚本。
  • 从oozie shell动作节点执行的脚本将运行java程序
  • 基于参数的java程序将运行first.jar或second.jar

我建议你以某种方式将shell脚本中的依赖关系转移到java代码中并使用oozie java action节点运行它,这将简化流程以实现良好的扩展。

如果从oozie shell动作节点运行Java jar是你的最后一个选择,那么我们将很好地做到这一点,但是我知道它有点复杂。

主要关注点是,

  • 任何Oozie动作都不能引用节点的本地文件系统上的内容,它只能引用HDFS上的内容
  • Java二进制命令只能引用本地文件系统上的文件。

因此,请按照以下步骤操作,这可能有助于您协调您的期望。

  1. 将Jar文件放在HDFS上
  2. 将Jar的HDFS绝对路径作为参数传递给shell脚本。
  3. 在shell脚本中,使用copyToLocal cmd将Jar从HDFS复制到运行操作的节点上的本地,在固定位置(可能是您喜欢的/ tmp)。
  4. 使用该节点上的Java命令调用Jar文件
  5. 完成后,如果Jar文件生成的任何输出要传递给下一个操作,则使用copyFromLocal将输出文件从本地复制到shell脚本中的HDFS