[AirFlow]AirFlow使用指南四DAGOperatorTask

sjf0115發表於2017-08-03

1. DAG

在Airflow中,DAG或有向無環圖是你執行所有任務的集合,以某種組織方式來反映所有任務之間的關係和依賴。

例如,一個簡單的DAG可以包括三個任務:A,B和C.可以說A必須在B執行之前成功執行,但C可以隨時執行。 可以說任務A在5分鐘後超時,為防止失敗,B可以最多重啟5次。也可以說工作流從某個特定日期開始每晚10點執行。

以這種方式,DAG描述了你如何執行工作流程; 但是請注意,我們還沒有說出我們實際想要做的事情! A,B和C可以是任何東西。也許在C傳送電子郵件時,A為B準備資料以進行分析。或者A監視你的位置,以便B可以開啟你的車庫門,而C開啟房子的燈。重要的是,DAG不關心其內部任務幹了什麼;它的目的是確保在正確的時間或以正確的順序幹任何事情,或可以正確處理任何意想不到的問題。

DAG在標準的Python檔案中定義,放置在Airflow的DAG_FOLDER中。Airflow將執行每個檔案中的程式碼來動態構建DAG物件。你可以擁有任意數量的DAG,每個可以擁有任意數量的任務。通常,每一個應該對應於一個邏輯工作流。

1.1 作用域(scope)

Airflow將載入從DAG檔案匯入的任何DAG物件。最重要的是,這意味著DAG必須出現在globals()中。考慮以下兩個DAG。只有dag_1將被載入;另一個只出現在區域性作用域內。

dag_1 = DAG(`this_dag_will_be_discovered`)

def my_function()
    dag_2 = DAG(`but_this_dag_will_not`)

my_function()

有時這有很好的用處。例如,SubDagOperator的通用模式是在函式內定義子dag,以便Airflow不會將其作為獨立DAG進行載入。

1.2 預設引數

如果將default_args字典傳遞給DAG,DAG將會將字典應用於其內部的任何Operator上。這很容易的將常用引數應用於多個Operator,而無需多次鍵入。

default_args=dict(
    start_date=datetime(2016, 1, 1),
    owner=`Airflow`)

dag = DAG(`my_dag`, default_args=default_args)
op = DummyOperator(task_id=`dummy`, dag=dag)
print(op.owner) # Airflow

1.3 上下文管理器(Context Manager)

備註

Airflow 1.8引入

DAG可用作上下文管理器,以自動為DAG分配新的Operator。

with DAG(`my_dag`, start_date=datetime(2016, 1, 1)) as dag:
    op = DummyOperator(`op`)

op.dag is dag # True

2. Operators

DAG描述瞭如何執行工作流,Operators決定了實際如何完成。

Operator描述了工作流中的單個任務。Operator通常(但不總是)原子性的,這意味著它們可以獨立存在,不需要與其他Operator共享資源。DAG將確保Operator按正確的順序執行; 除了這些依賴之外,Operator通常獨立執行。實際上,他們可能會執行在兩臺完全不同的機器上。

這是一個微小但非常重要的一點:一般來說,如果兩個Operator需要共享資訊,如檔名或少量資料,則應考慮將它們組合成一個Operator。如果絕對不可避免,Airflow確實有一個名為XCom的Operator可以交叉通訊。

Airflow為Operator提供許多常見任務,包括:

  • BashOperator – 執行bash命令
  • PythonOperator – 呼叫任意的Python函式
  • EmailOperator – 傳送郵件
  • HTTPOperator – 傳送 HTTP 請求
  • SqlOperator – 執行 SQL 命令
  • Sensor – 等待一定時間,檔案,資料庫行,S3鍵等…

除了這些基本的構建塊之外,還有更多的特定Operator:DockerOperatorHiveOperatorS3FileTransferOperatorPrestoToMysqlOperatorSlackOperator …總之你能想到的!

airflow/contrib/目錄包含更多由社群建立的Operator。這些Operator並不總是與主包(in the main distribution)中的Operator一樣完整或經過很好的測試,但允許使用者更輕鬆地向平臺新增新功能。

Operators只有在分配給DAG時,才會被Airflow載入。

2.1 DAG分配

備註

在Airflow 1.8版本中引入

Operator不需要立即分配給DAG(以前dag是必需的引數)。但是一旦operator分配給DAG, 它就不能transferred或者unassigned. 當一個Operator建立時,通過延遲分配或甚至從其他Operator推斷,可以讓DAG得到明確的分配(DAG assignment can be done explicitly when the operator is created, through deferred assignment, or even inferred from other operators.).

dag = DAG(`my_dag`, start_date=datetime(2016, 1, 1))

# 明確指定DAG
explicit_op = DummyOperator(task_id=`op1`, dag=dag)

# 延遲分配
deferred_op = DummyOperator(task_id=`op2`)
deferred_op.dag = dag

# 從其他Operator推斷 (linked operators must be in the same DAG)
inferred_op = DummyOperator(task_id=`op3`)
inferred_op.set_upstream(deferred_op)

2.2 位移組合

備註

在Airflow 1.8版本中引入

傳統上,使用set_upstream()set_downstream()方法來設定Operator之間的依賴關係。在Airflow 1.8中,可以使用Python位移操作符>><<。 以下四個語句在功能上相當:

op1 >> op2
op1.set_downstream(op2)

op2 << op1
op2.set_upstream(op1)

當使用位移操作符去設定Operator依賴關係時,根據位移操作符指向的方向來判斷Operator之間的依賴關係。例如,op1 >> op2 表示op1先執行,op2然後執行。可以組合多個Operator – 記住從左到右執行的鏈,總是返回最右邊的物件。 例如:

op1 >> op2 >> op3 << op4

等價於:

op1.set_downstream(op2)
op2.set_downstream(op3)
op3.set_upstream(op4)

為方便起見,位移操作符也可以與DAG一起使用。 例如:

dag >> op1 >> op2

等價於:

op1.dag = dag
op1.set_downstream(op2)

我們可以把這一切整合在一起,建立一個簡單的管道:

with DAG(`my_dag`, start_date=datetime(2016, 1, 1)) as dag:
    (
        dag
        >> DummyOperator(task_id=`dummy_1`)
        >> BashOperator(
            task_id=`bash_1`,
            bash_command=`echo "HELLO!"`)
        >> PythonOperator(
            task_id=`python_1`,
            python_callable=lambda: print("GOODBYE!"))
    )

3. Task

一旦Operator被例項化,它被稱為”任務”。例項化為在呼叫抽象Operator時定義一些特定值,引數化任務使之成為DAG中的一個節點。

4. 任務例項化

一個任務例項表示任務的一次特定執行,並且被表徵為dag,任務和時間點的組合。任務例項也有指示性狀態,可能是“執行”,“成功”,“失敗”,“跳過”,“重試”等。

5. 工作流

現在你已經熟悉了Airflow的核心構建塊。一些概念可能聽起來似曾相似,但詞彙可以這樣概念化:

  • DAG:描述工作發生的順序
  • Operator:執行某些工作的模板類
  • Task:Operator的引數化例項
  • TaskInstances(任務例項):1)已分配給DAG的任務,2)具有DAG特定執行相關的狀態

通過組合DAGOperators來建立TaskInstances,可以構建複雜的工作流。

原文:http://airflow.incubator.apache.org/concepts.html#


相關文章