分佈式任務調度框架 Azkaban —— Flow 2.0 的使用

1、Flow 2.0 簡介

1.1 Flow 2.0 的產生

Azkaban 目前同時支持 Flow 1.0 和 Flow2.0 ,可是官方文檔上更推薦使用 Flow 2.0,由於 Flow 1.0 會在未來的版本被移除。Flow 2.0 的主要設計思想是提供 1.0 所沒有的流級定義。用戶能夠將屬於給定流的全部 job / properties 文件合併到單個流定義文件中,其內容採用 YAML 語法進行定義,同時還支持在流中再定義流,稱爲爲嵌入流或子流。java

1.2 基本結構

項目 zip 將包含多個流 YAML 文件,一個項目 YAML 文件以及可選庫和源代碼。Flow YAML 文件的基本結構以下:node

  • 每一個 Flow 都在單個 YAML 文件中定義;
  • 流文件以流名稱命名,如:my-flow-name.flow
  • 包含 DAG 中的全部節點;
  • 每一個節點能夠是做業或流程;
  • 每一個節點 能夠擁有 name, type, config, dependsOn 和 nodes sections 等屬性;
  • 經過列出 dependsOn 列表中的父節點來指定節點依賴性;
  • 包含與流相關的其餘配置;
  • 當前 properties 文件中流的全部常見屬性都將遷移到每一個流 YAML 文件中的 config 部分。

官方提供了一個比較完善的配置樣例,以下:git

config:
  user.to.proxy: azktest
  param.hadoopOutData: /tmp/wordcounthadoopout
  param.inData: /tmp/wordcountpigin
  param.outData: /tmp/wordcountpigout

# This section defines the list of jobs
# A node can be a job or a flow
# In this example, all nodes are jobs
nodes:
 # Job definition
 # The job definition is like a YAMLified version of properties file
 # with one major difference. All custom properties are now clubbed together
 # in a config section in the definition.
 # The first line describes the name of the job
 - name: AZTest
   type: noop
   # The dependsOn section contains the list of parent nodes the current
   # node depends on
   dependsOn:
     - hadoopWC1
     - NoOpTest1
     - hive2
     - java1
     - jobCommand2

 - name: pigWordCount1
   type: pig
   # The config section contains custom arguments or parameters which are
   # required by the job
   config:
     pig.script: src/main/pig/wordCountText.pig

 - name: hadoopWC1
   type: hadoopJava
   dependsOn:
     - pigWordCount1
   config:
     classpath: ./*
     force.output.overwrite: true
     input.path: ${param.inData}
     job.class: com.linkedin.wordcount.WordCount
     main.args: ${param.inData} ${param.hadoopOutData}
     output.path: ${param.hadoopOutData}

 - name: hive1
   type: hive
   config:
     hive.script: src/main/hive/showdb.q

 - name: NoOpTest1
   type: noop

 - name: hive2
   type: hive
   dependsOn:
     - hive1
   config:
     hive.script: src/main/hive/showTables.sql

 - name: java1
   type: javaprocess
   config:
     Xms: 96M
     java.class: com.linkedin.foo.HelloJavaProcessJob

 - name: jobCommand1
   type: command
   config:
     command: echo "hello world from job_command_1"

 - name: jobCommand2
   type: command
   dependsOn:
     - jobCommand1
   config:
     command: echo "hello world from job_command_2"

2、YAML語法

想要使用 Flow 2.0 進行工做流的配置,首先須要瞭解 YAML 。YAML 是一種簡潔的非標記語言,有着嚴格的格式要求的,若是你的格式配置失敗,上傳到 Azkaban 的時候就會拋出解析異常。github

2.1 基本規則

  1. 大小寫敏感 ;
  2. 使用縮進表示層級關係 ;
  3. 縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級;
  4. 使用#表示註釋 ;
  5. 字符串默認不用加單雙引號,但單引號和雙引號均可以使用,雙引號表示不須要對特殊字符進行轉義;
  6. YAML 中提供了多種常量結構,包括:整數,浮點數,字符串,NULL,日期,布爾,時間。

2.2 對象的寫法

# value 與 : 符號之間必需要有一個空格
key: value

2.3 map的寫法

# 寫法一 同一縮進的全部鍵值對屬於一個map
key: 
    key1: value1
    key2: value2

# 寫法二
{key1: value1, key2: value2}

2.3 數組的寫法

# 寫法一 使用一個短橫線加一個空格表明一個數組項
- a
- b
- c

# 寫法二
[a,b,c]

2.5 單雙引號

支持單引號和雙引號,但雙引號不會對特殊字符進行轉義:sql

s1: '內容\n 字符串'
s2: "內容\n 字符串"

轉換後:
{ s1: '內容\\n 字符串', s2: '內容\n 字符串' }

2.6 特殊符號

一個 YAML 文件中能夠包括多個文檔,使用 --- 進行分割。shell

2.7 配置引用

Flow 2.0 建議將公共參數定義在 config 下,並經過 ${} 進行引用。數組

3、簡單任務調度

3.1 任務配置

新建 flow 配置文件:oop

nodes:
  - name: jobA
    type: command
    config:
      command: echo "Hello Azkaban Flow 2.0."

在當前的版本中,Azkaban 同時支持 Flow 1.0 和 Flow 2.0,若是你但願以 2.0 的方式運行,則須要新建一個 project 文件,指明是使用的是 Flow 2.0:大數據

azkaban-flow-version: 2.0

3.2 打包上傳

3.3 執行結果

因爲在 1.0 版本中已經介紹過 Web UI 的使用,這裏就再也不贅述。對於 1.0 和 2.0 版本,只有配置方式有所不一樣,其餘上傳執行的方式都是相同的。執行結果以下:ui

4、多任務調度

和 1.0 給出的案例同樣,這裏假設咱們有五個任務(jobA——jobE), D 任務須要在 A,B,C 任務執行完成後才能執行,而 E 任務則須要在 D 任務執行完成後才能執行,相關配置文件應以下。能夠看到在 1.0 中咱們須要分別定義五個配置文件,而在 2.0 中咱們只須要一個配置文件便可完成配置。

nodes:
  - name: jobE
    type: command
    config:
      command: echo "This is job E"
    # jobE depends on jobD
    dependsOn: 
      - jobD
    
  - name: jobD
    type: command
    config:
      command: echo "This is job D"
    # jobD depends on jobA、jobB、jobC
    dependsOn:
      - jobA
      - jobB
      - jobC

  - name: jobA
    type: command
    config:
      command: echo "This is job A"

  - name: jobB
    type: command
    config:
      command: echo "This is job B"

  - name: jobC
    type: command
    config:
      command: echo "This is job C"

5、內嵌流

Flow2.0 支持在一個 Flow 中定義另外一個 Flow,稱爲內嵌流或者子流。這裏給出一個內嵌流的示例,其 Flow 配置以下:

nodes:
  - name: jobC
    type: command
    config:
      command: echo "This is job C"
    dependsOn:
      - embedded_flow

  - name: embedded_flow
    type: flow
    config:
      prop: value
    nodes:
      - name: jobB
        type: command
        config:
          command: echo "This is job B"
        dependsOn:
          - jobA

      - name: jobA
        type: command
        config:
          command: echo "This is job A"

內嵌流的 DAG 圖以下:

執行狀況以下:

參考資料

  1. Azkaban Flow 2.0 Design
  2. Getting started with Azkaban Flow 2.0

更多大數據系列文章能夠參見 GitHub 開源項目大數據入門指南

相關文章
相關標籤/搜索