繼前一篇大致上翻譯了Email的Action配置,本篇繼續看一下Shell的相關配置。java
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
<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表達式。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標準輸出和錯誤輸出均可以直接輸出到oozie的mapreduce任務控制檯上。
經過oozie web控制檯,也能夠看到它的執行日誌。
儘管shell能夠執行任何的腳本命令,可是仍是有一些限制的。
shell能夠輸出java properties格式的數據,而且能夠配合EL表達式,在其餘的action中使用。所以它能夠做爲工做流的初始化任務,以及配置服務。
好比,在腳本中:
#!/bin/sh a=1 b=2 echo "a=$a" echo "b=$b"
在其餘的節點中就能夠經過EL表達式來使用了。