前篇講述了下什么是流控制節點,本篇繼續來說一下什么是 Action Nodes操作節點。Action節點有一些比較通用的特性:
Action節點是遠程的
所有oozie創建的計算和處理任務都是異步的,沒有任何應用是工作在oozie內部的。基本上都是創建一個oozie任務,oozie任務會以map的形式,在各個節點再創建相應的任務。因此當你執行spark任務的時候,就會發現yarn集群監控列表里面會同時有兩個任務出現。
Action節點是異步的
oozie創建的任務都是異步的,對於大多數的任務來說,oozie都是創建action,然后一直等到這個action完成,才退出。對於fs的異常操作來說,是同步的。
oozie可以通過兩種方式檢測任務是否完成——回調和輪訓。
當oozie創建一個任務時,會提供一個唯一的回調url,當任務完成時,會調用該url通知完成。當無法回調時,也可以采用輪訓的機制,檢測是否完成。
Action有兩種狀態,ok和error
如果任務異常退出,那么需要明確的提供error-code,這個信息可以用於decision控制節點進行決策選擇。每個工作流都應該清晰的定義errorcode
Action的恢復機制
oozie對於不同的錯誤有不同的處理方式:
- 對於那些偶然的錯誤,比如網絡原因或者遠程系統暫時不能訪問,oozie會根據預先設置的參數進行重試。這個參數可以在action中進行重寫。
- 對於那些非偶然的錯誤,oozie會掛起任務,直到管理員或者外部系統手動解決。
一些常用的Action
FS Action
fs Action允許操作hdfs上的文件或者目錄,比如move,delete,mkdir,chmod,touchz,chgrp等等。
這個FS命令都是同步執行的,只有節點完成該命令操作,才會繼續往下執行。
如果使用了路徑,那么路徑可以使用EL表達式參數化,但是一定要是絕對路徑才行。對於move,delete,chmod,chgrp命令來說,可以使用通配符。但是對於move命令,只能給源路徑使用通配。
語法規則如下:
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">
...
<action name="[NODE-NAME]">
<fs>
<delete path='[PATH]'/>
...
<mkdir path='[PATH]'/>
...
<move source='[SOURCE-PATH]' target='[TARGET-PATH]'/>
...
<chmod path='[PATH]' permissions='[PERMISSIONS]' dir-files='false' />
...
<touchz path='[PATH]' />
...
<chgrp path='[PATH]' group='[GROUP]' dir-files='false' />
</fs>
<ok to="[NODE-NAME]"/>
<error to="[NODE-NAME]"/>
</action>
...
</workflow-app>
delete命令可以刪除指定的路徑的內容,如果目標是一個目錄,那么會級聯刪除下面的所有內容。
mkdir命令會創建指定的路徑內容,如果路徑上缺少父級目錄,也會自動創建。如果目錄已經存在,那么什么都不會做。
在move命令中,source路徑必須要指定。下面是使用move的一些場景:
- 文件系統URI(比如hdfs://{namenode})可以在target中省略,因為系統會默認使用source的URI。
- target路徑的父級目錄都必須存在
- 如果target目錄已經存在,那么將會替換目標文件
chmod命令可以改變路徑的權限。權限跟linux類似,都是-rwxrw-rw-或者755的形式。默認的情況下權限會應用到目標目錄以及其子文件。如果只想應用到目錄而不影響它的文件,可以把dir-files屬性設置為false.如果想要級聯修改內部的所有文件,可以內部嵌套一個recursive元素.
touchz命令在該文件不存在的時候會創建一個長度為0的文件。如果文件已經存在,那么僅會更新一下該文件的修改時間。touchz命令僅支持絕對路徑。
chgrp命令可以修改路徑的所有組。屬性跟chmod是一樣的。
舉個例子:
<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.5">
...
<action name="hdfscommands">
<fs>
<delete path='hdfs://foo:8020/usr/tucu/temp-data'/>
<mkdir path='archives/${wf:id()}'/>
<move source='${jobInput}' target='archives/${wf:id()}/processed-input'/>
<chmod path='${jobOutput}' permissions='-rwxrw-rw-' dir-files='true'><recursive/></chmod>
<chgrp path='${jobOutput}' group='testgroup' dir-files='true'><recursive/></chgrp>
</fs>
<ok to="myotherjob"/>
<error to="errorcleanup"/>
</action>
...
</workflow-app>
在其他的工作流節點中,也可以使用fs操作:
<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.4">
...
<action name="hdfscommands">
<fs>
<name-node>hdfs://foo:8020</name-node>
<job-xml>fs-info.xml</job-xml>
<configuration>
<property>
<name>some.property</name>
<value>some.value</value>
</property>
</configuration>
<delete path='/usr/tucu/temp-data'/>
</fs>
<ok to="myotherjob"/>
<error to="errorcleanup"/>
</action>
...
</workflow-app>
這個功能在其他的工作流節點中是非常常用的,像我們平時使用的sqoop操作都需要實現執行以下delete刪除目標數據。
