工作流引擎Oozie(二):coordinator

安全劍客發表於2020-03-11
coordinator是workflow的定時提交器,基於時間條件與資料生成觸發(based on time and data triggers)。簡單點說,coordinator按所定義的時間週期進行輪詢,若資料生成條件滿足,則觸發workflow任務;否則,則等待資料生成或跳過(排程策略由設定的超時時間決定)。

工作流引擎Oozie(二):coordinator工作流引擎Oozie(二):coordinator

coordinator-app
coordinator-app name="coord-demo" frequency="${coord:days(1)}" start="${start_time}" end="${end_time}"
timezone="Asia/Shanghai" xmlns="uri:oozie:coordinator:0.1"

檔案頭定義了coordinator任務的名稱,執行頻率(frequency),開始與起止時間(start、end)。${coord:days(1)}為coordinator內建的EL function (Expression Language),表示為執行週期為一天。frequency的時間單位為分鐘,則${coord:days(1)}=1440,${coord:hours(3)}=180. 一般地,在job.properties定義如:start_time=2016-06-07T00:00Z,應以UTC時區為準。

Control information
<controls>
    <!--超時時間,若為0,一旦資料生成超時則coordinator action被丟棄;
    若為-1,則一直等待資料生成;
    若 > 0,即為超時時間(單位:分鐘)-->
    <timeout>-1</timeout>
    <!--併發action數-->
    <concurrency>1</concurrency>
    <!--同時被觸發的多個coordinator job的執行次序-->
    <execution>${execution_order}</execution>
</controls>
datasets
<datasets>
    <!--資料生成目錄-->
    <dataset name="data" frequency="${coord:hours(1)}" initial-instance="${start_time}" timezone="${timezone}">
      <uri-template>${nameNode}/path/to/${YEAR}-${MONTH}-${DAY}/${HOUR}/</uri-template>
      <done-flag></done-flag>
    </dataset>
</datasets>

相關引數:

  • initial-instance,對應初始時間的資料目錄,作為時間週期偏移的基準目錄
  • uri-template,檔案目錄HDFS目錄,${YEAR}、${MONTH}等為EL Time Constants,具體數值由 傳入,也可透過job.properties傳入自定義的引數。
  • done-flag,資料目錄生成的檔案標識,若未指定,則預設為 _SUCCESS 檔案;若指定為空,則表示資料夾本身。
  • input-events
<input-events>
    <data-in name="dataReady" dataset="data">
      <instance>${coord:current(-1)}</instance>
    </data-in>
</input-events>

定義了資料觸發條件,${coord:current(-1)}表示對於當前時間的偏移,其中偏移量=數值* dataset frequency。有些時候,我們要判斷多個目錄是否生成,比如,判斷一天的24個小時目錄,這時應這樣寫:

<data-in name="dataReady2" dataset="data">
  <start-instance>${coord:current(-24)}</start-instance>
  <end-instance>${coord:current(-1)}</end-instance>
</data-in>
action
<action>
    <workflow>
      <app-path>${wf_app_path}</app-path>
      <configuration>
        <property>
          <name>dayTime</name>
          <value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'DAY'), 'yyyy-MM-dd')}</value>
        </property>
      </configuration>
    </workflow>
</action>

定義coordinator要觸發的workflow,

  • app-path,workflow所在的HDFS目錄;
  • property,定義傳給workflow的引數
  • coordinator提供了一些用於時間計算的函式,比如:

  • coord:nominalTime(),返回coordinator的每一執行週期的當前時間;
  • coord:dateOffset(String baseDate, int instance, String timeUnit),計算偏移後的時間,newDate = baseDate + instance * timeUnit;
  • coord:formatTime(String ts, String format),定義格式化的時間,其中format應遵循Java's SimpleDateFormat。
  • 返回多個時間:

    <value>${coord:formatTime(coord:dateOffset(coord:dateOffset(coord:nominalTime(), -12, 'HOUR'), -6, 'DAY'), 'yyyy-MM-dd')},${coord:formatTime(coord:dateOffset(coord:dateOffset(coord:nominalTime(), -12, 'HOUR'), -5, 'DAY')</value>

    原文地址:

    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2679715/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章