繼前一篇大體上翻譯了Email的Action配置,本篇繼續看一下Shell的相關配置。 Shell Action Shell Action可以執行Shell腳本命令,工作流會等到shell完全執行完畢後退出,再執行下一個節點。為了運行shell,必須配置 以及 ,並且設置 來執行shell. She ...
繼前一篇大體上翻譯了Email的Action配置,本篇繼續看一下Shell的相關配置。
Shell Action
Shell Action可以執行Shell腳本命令,工作流會等到shell完全執行完畢後退出,再執行下一個節點。為了運行shell,必須配置job-tracker
以及name-node
,並且設置exec
來執行shell.
Shell既可以使用job-xml引用一個配置文件,也可以在shell action內直接配置。shell action中的配置會覆蓋job-xml中的配置。
EL表達式同樣適用於shell action。
註意,mapred.job.tracker
以及fs.default.name
屬性不能再shell action中直接配置。
在mapreduce任務中可以處理一些資源,這樣shell就可以使用了。更多的內容參考[WorkflowFunctionalSpec#FilesAchives]``[Adding Files and Archives for the Job]
章節。
shell的輸出可以被後面的工作流任務使用,這些信息可以用來配置一些關鍵的信息。如果shell的輸出想要對整個工作流任務可用,那麼必須滿足
- 輸出的格式是標準的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腳本。
<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工作的參數有
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表達式來使用了。