­

Azkaban-3.x Conditional Workflow

  • 2019 年 10 月 11 日
  • 筆記

1. What is Azkaban Conditional Workflow?

Conditional Workflow的作用是,用戶可以指定一些條件來運行Job,比如可以根據上一個Job的輸出結果來判斷是否運行下一個Job,或者用戶可以把Flow中的各個Job做成分支結構,Conditional Workflow功能使得用戶在配置Flow的時候有了更大的靈活性。

2. How to define a condition?

依據其他Job的輸出的參數

nodes:   - name: JobA     type: command     config:       command: sh jobA.sh     - name: JobB     type: command     dependsOn:       - JobA     config:       command: echo "This is JobB."     condition: ${JobA:param1} == 1

這裡只有當JobA輸出的參數param1=1時,JobB才會執行,在JobA的最後應該輸出這個param1的值到$JOB_OUTPUT_PROP_FILE文件中,這個文件具體是什麼用戶不用關心,JobB會去這個文件中讀取JobA設置的param1參數的值。例如,在上面的例子中,在jobA.sh的末尾應該輸出param1的值:

#!/bin/bash    echo "This is JobA."  echo '{"param1": "1"}' > $JOB_OUTPUT_PROP_FILE

參數值的比較支援這些運算符:==, !=, >, >=, <, <=

依據其他Job的執行狀態

Azkaban支援如下語義:

  • all_success (default):依賴的Job全部執行成功後,執行當前Job
  • all_done:依賴的Job全部執行完成後,執行當前Job
  • all_failed:依賴的Job全部執行失敗後,執行當前Job
  • one_success:依賴的Job只要有一個執行成功後,執行當前Job
  • one_failed :依賴的Job只要有一個執行失敗後,執行當前Job

需要根據Job的狀態來判斷Job是否滿足以上語義:

  • all_done: FAILED, KILLED, SUCCEEDED, SKIPPED, FAILED_SUCCEEDED, CANCELLED
  • all_success / one_success: SUCCEEDED, SKIPPED, FAILED_SUCCEEDED
  • all_failed / one_failed: FAILED, KILLED, CANCELLED

示例:

- name: JobD     type: command     dependsOn:       - JobB       - JobC     config:       command: pwd     condition: one_success

只要JobB或者JobC有一個任務執行成功,就執行JobD

依據其他Job輸出參數和執行狀態的各種組合

使用&&, ||, !可以構造出多種多樣的條件判斷組合,例如

${JobA:param1} == 1 && ${JobB:param2} > 5  one_success  all_done && ${JobC:param3} != "foo"  (!{JobD:param4} || !{JobE:parm5}) && all_success || ${JobF:parm6} == "bar"

以下是一個完整的示例:

nodes:   - name: JobA     type: command     config:       command: bash ./write_to_props.sh     - name: JobB     type: command     dependsOn:       - JobA     config:       command: echo 「This is JobB.」     condition: ${JobA:param1} == 1     - name: JobC     type: command     dependsOn:       - JobA     config:       command: echo 「This is JobC.」     condition: ${JobA:param1} == 2     - name: JobD     type: command     dependsOn:       - JobB       - JobC     config:       command: pwd     condition: one_success

可以在頁面上查看這個Flow中各個Job之間的依賴關係:

image

image

image