Oozie分佈式任務的工做流——腳本篇

繼前一篇大致上翻譯了Email的Action配置,本篇繼續看一下Shell的相關配置。java

Shell Action

Shell Action能夠執行Shell腳本命令,工做流會等到shell徹底執行完畢後退出,再執行下一個節點。爲了運行shell,必須配置job-tracker以及name-node,而且設置exec來執行shell.node

Shell既可使用job-xml引用一個配置文件,也能夠在shell action內直接配置。shell action中的配置會覆蓋job-xml中的配置。web

EL表達式一樣適用於shell action。shell

注意,mapred.job.tracker以及fs.default.name屬性不能再shell action中直接配置。c#

在mapreduce任務中能夠處理一些資源,這樣shell就可使用了。更多的內容參考[WorkflowFunctionalSpec#FilesAchives]``[Adding Files and Archives for the Job]章節。緩存

shell的輸出能夠被後面的工做流任務使用,這些信息能夠用來配置一些關鍵的信息。若是shell的輸出想要對整個工做流任務可用,那麼必須知足app

  • 輸出的格式是標準的java屬性文件
  • 輸出的內容不能超過2KB

語法

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.3">
    ...
    <action name="[NODE-NAME]">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>[JOB-TRACKER]</job-tracker>
            <name-node>[NAME-NODE]</name-node>
            <prepare>
               <delete path="[PATH]"/>
               ...
               <mkdir path="[PATH]"/>
               ...
            </prepare>
            <job-xml>[SHELL SETTINGS FILE]</job-xml>
            <configuration>
                <property>
                    <name>[PROPERTY-NAME]</name>
                    <value>[PROPERTY-VALUE]</value>
                </property>
                ...
            </configuration>
            <exec>[SHELL-COMMAND]</exec>
            <argument>[ARG-VALUE]</argument>
                ...
            <argument>[ARG-VALUE]</argument>
            <env-var>[VAR1=VALUE1]</env-var>
               ...
            <env-var>[VARN=VALUEN]</env-var>
            <file>[FILE-PATH]</file>
            ...
            <archive>[FILE-PATH]</archive>
            ...
            <capture-output/>
        </shell>
        <ok to="[NODE-NAME]"/>
        <error to="[NODE-NAME]"/>
    </action>
    ...
</workflow-app>
  • prepare元素,常常用於建立一系列的目錄或者刪除目錄。注意目錄必須是hdfs://host:port這種格式的。
  • job-xml元素,指定shell任務的配置。在0.2的schema中,job-xml元素容許指定多個job-xml文件。
  • configuration元素,包含了shell任務的配置信息。
  • exec元素,這個是必填項。包含了shell腳本的路徑,並執行它。參數能夠設置0個或者多個argument元素。
  • argument元素,用於傳遞給shell腳本。
  • env-var元素,能夠設置環境變量,傳遞給shell腳本。env-var須要包含鍵值對這種的信息。好比包含$PATH這種信息,那麼須要設置PATH=$PATH:mypath這種格式。不要使用${}這種語法,由於它會被認爲是Oozie的EL表達式。
  • shell action也能夠建立hadoop的配置。shell應用能夠直接讀取配置文件。
  • capture-output元素,用來指定輸出端。shell命令輸出必須是java屬性這種格式,而且小於2kb.經過工做流的定義,輸出也能夠經過string action實現。

上面這些元素都支持EL表達式。分佈式

例子

如何運行shell或者perl腳本。oop

<workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'>
    <start to='shell1' />
    <action name='shell1'>
        <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>${EXEC}</exec>
            <argument>A</argument>
            <argument>B</argument>
            <file>${EXEC}#${EXEC}</file> <!--Copy the executable to compute node's current working directory -->
        </shell>
        <ok to="end" />
        <error to="fail" />
    </action>
    <kill name="fail">
        <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name='end' />
</workflow-app>

用於提交oozie工做的參數有spa

oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Execute is expected to be in the Workflow directory.
#Shell Script to run
EXEC=script.sh
#CPP executable. Executable should be binary compatible to the compute node OS.
#EXEC=hello
#Perl script
#EXEC=script.pl
jobTracker=localhost:8021
nameNode=hdfs://localhost:8020
queueName=default

如何運行java程序並添加jar包

<workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'>
    <start to='shell1' />
    <action name='shell1'>
        <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>java</exec>
            <argument>-classpath</argument>
            <argument>./${EXEC}:$CLASSPATH</argument>
            <argument>Hello</argument>
            <file>${EXEC}#${EXEC}</file> <!--Copy the jar to compute node current working directory -->
        </shell>
        <ok to="end" />
        <error to="fail" />
    </action>
    <kill name="fail">
        <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name='end' />
</workflow-app>

提交的相關參數

oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Hello.jar file is expected to be in the Workflow directory.
EXEC=Hello.jar
jobTracker=localhost:8021
nameNode=hdfs://localhost:8020
queueName=default

shell Action日誌

shell action標準輸出和錯誤輸出均可以直接輸出到oozie的mapreduce任務控制檯上。

經過oozie web控制檯,也能夠看到它的執行日誌。

shell action的限制

儘管shell能夠執行任何的腳本命令,可是仍是有一些限制的。

  • 不支持交互式的命令
  • 命令不能使用不一樣的用戶執行
  • 用戶必須嚴格控制上傳的jar包。oozie會把他上傳到分佈式環境中進行緩存
  • 儘管oozie在hadoop的計算節點執行shell命令,可是可能有一些默認安裝的工能是不支持的。所以須要瞭解,oozie能夠支持安裝在計算節點的命令。

實戰分析

shell能夠輸出java properties格式的數據,而且能夠配合EL表達式,在其餘的action中使用。所以它能夠做爲工做流的初始化任務,以及配置服務。

好比,在腳本中:

#!/bin/sh
a=1
b=2
echo "a=$a"
echo "b=$b"

在其餘的節點中就能夠經過EL表達式來使用了。

相關文章
相關標籤/搜索