복붙노트

[HADOOP] OOZIE 쉘 노드의 쉘 스크립트에 Jar 파일을 전달하는 방법

HADOOP

OOZIE 쉘 노드의 쉘 스크립트에 Jar 파일을 전달하는 방법

안녕하세요 oozie 셸 작업 흐름에서 실행되는 스크립트에서 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

workflow.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 디렉토리에서 jar 파일, 이유는이 디렉토리가 워크 플로우 사용자에게 oozie에게 사용 권한 문제를 생성하지 않습니다.

방향 / 제안이 도움이 될 것입니다.

너트 껍질에 내 질문 :

해결법

  1. ==============================

    1.어떻게 든 쉘 스크립트의 종속성을 java 코드로 옮기고 oozie java action 노드를 사용하여 실행하면 좋을 것입니다. 이는 좋은 프로세스를 단순화합니다.

    어떻게 든 쉘 스크립트의 종속성을 java 코드로 옮기고 oozie java action 노드를 사용하여 실행하면 좋을 것입니다. 이는 좋은 프로세스를 단순화합니다.

    oozie 쉘 액션 노드에서 Java jar를 실행하는 것이 마지막 옵션이라면, 우리는 그렇게 할 것이지만, 내가 아는 한 조금 복잡합니다.

    주요 관심사는 다음과 같습니다.

    따라서 아래의 단계를 따르면 도움이 될 수 있습니다.

  2. from https://stackoverflow.com/questions/32202151/how-to-pass-jar-files-to-shell-script-in-oozie-shell-node by cc-by-sa and MIT license