Oozie分布式工作流——Action節點


前篇講述了下什么是流控制節點,本篇繼續來說一下什么是 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刪除目標數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM