java—如何将jar文件传递到oozie shell节点中的shell脚本

wi3ka0sx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(403)

嗨,我得到下面的错误,而运行一个脚本中的java程序,这是正在执行的oozie外壳动作工作流。

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.<init>(ZipFile.java:215)
Stdoutput 2015-08-25 03:36:02,637  INFO [pool-1-thread-1] (ProcessExecute.java:68) -    at java.util.zip.ZipFile.<init>(ZipFile.java:145)
Stdoutput 2015-08-25 03:36:02,637  INFO [pool-1-thread-1] (ProcessExecute.java:68) -    at java.util.jar.JarFile.<init>(JarFile.java:154)
Stdoutput 2015-08-25 03:36:02,637  INFO [pool-1-thread-1] (ProcessExecute.java:68) -    at java.util.jar.JarFile.<init>(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

以下是文件详细信息:
作业属性:

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

工作流.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<workflow-app name="test" xmlns="uri:oozie:workflow:0.4">
    <start to="first" />
    <action name="first">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                </configuration>
            <exec>script</exec>
        <argument>-type mine</argument>
        <argument>-cfg config.cfg</argument>
            <file>script</file>
            <file>${EXEC}#${EXEC}</file>
            <file>config.cfg</file>
            <file>first.jar#first.jar</file>
            <file>second.jar#second.jar</file>
        </shell>
        <ok to="end" />
        <error to="fail" />
    </action>
    <kill name="fail">
        <message>Workflow failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end" />
</workflow-app>

脚本:


# !/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

iyzzxitl

iyzzxitl1#

我建议您以某种方式将依赖关系从shell脚本转移到java代码中,并使用oozie java action节点运行它,这将很好地简化流程。
如果从oozie shell action节点运行javajar是您的最后一个选择,那么我们将很好地做到这一点,但据我所知,这有点复杂。
主要问题是,
任何oozie操作都不能引用节点本地文件系统上的内容,只能引用hdfs上的内容
javabinary命令只能引用本地文件系统上的文件。
因此,请遵循以下步骤,这可能有助于协调您的期望。
将jar文件放在hdfs上
将jar的hdfs绝对路径作为参数传递给shell脚本。
在shell脚本中,使用copytolocal cmd将jar从hdfs复制到运行操作的节点上的本地,该节点位于固定位置(可能是/tmp,您更喜欢这样)。
在该节点上使用java命令调用jar文件
完成时,如果jar文件生成的任何输出要传送到下一个操作,则使用copyfromlocal将该输出文件从本地复制到shell脚本中的hdfs。

相关问题