如何将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二进制命令只能引用本地文件系统上的文件。
因此,请按照以下步骤操作,这可能有助于您协调您的期望。
- 将Jar文件放在HDFS上
- 将Jar的HDFS绝对路径作为参数传递给shell脚本。
- 在shell脚本中,使用copyToLocal cmd将Jar从HDFS复制到运行操作的节点上的本地,在固定位置(可能是您喜欢的/ tmp)。
- 使用该节点上的Java命令调用Jar文件
- 完成后,如果Jar文件生成的任何输出要传递给下一个操作,则使用copyFromLocal将输出文件从本地复制到shell脚本中的HDFS 。
- 即使Hadoop正在运行,Hadoop也没有在作业跟踪器中显示我的工作
- Hadoop:java.lang.ClassCastException:org.apache.hadoop.io.LongWritable无法强制转换为org.apache.hadoop.io.Text
- 使用Java API从Hive获取表属性
- 使用ArrayWritable的序列化似乎以一种有趣的方式工作
- hbase-site.xml中的zookeeper仲裁设置究竟是什么?
- 在Hadoop中传播自定义配置值
- 将参数传递给Hadoop中的map函数
- Pipeling hadoop map减少了工作量
- 将1GB数据加载到hbase中需要1小时