【问题标题】:How to pass Jar files to shell script in OOZIE shell node如何将 Jar 文件传递​​给 OOZIE shell 节点中的 shell 脚本
【发布时间】:2023-03-08 03:06:01
【问题描述】:

您好,我在 oozie shell 操作工作流中执行的脚本中运行 java 程序时遇到错误。

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

以下是文件详细信息:

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

工作流.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

【问题讨论】:

    标签: java shell hadoop hdfs oozie


    【解决方案1】:

    我建议您以某种方式将依赖关系从 shell 脚本转移到 java 代码中,并使用 oozie java 操作节点运行它,这将简化该过程以进行良好的扩展。

    如果从 oozie shell 操作节点运行 Java jar 是您的最后选择,那么我们会很好地做到这一点,但据我所知,这有点复杂。

    主要关注点是,

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

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

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

    【讨论】:

    • 将智慧转化为实际行动:1. 将您的 JAR 上传到 HDFS 目录 2. 告诉 Oozie 将 JAR 下载到用于与&lt;file&gt;/user/johndoe/some/dir/first.jar&lt;file&gt; 一起执行的 YARN 容器(如果您不需要重命名文件,# 将无用)3. 更改您的 shell 脚本以期望 当前工作的 JAR目录 例如java -cp ./first.jar whatever
    • @Nitin Mahesh,你能解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多