Airflow overview(airflow 初探)

原文轉自微信公衆號“ 雲計算技術棧“:https://mp.weixin.qq.com/s/scyeGGGHMWZ55A174vAYfQ

Airflow overview(airflow 初探)

airflow 簡介

Airflow 是一個Apache下的頂級開源項目。它基於DAG(Directed Acyclic Graph)有向無環圖來組織workflow。提供了可視化的UI可以方便的對系統當前狀態,任務執行情況等進行管理。以python代碼的形式來實現工作流的定義對程序員非常友好。提供了很多的集成及擴展能力。


airflow 主要概念

airflow 中主要涉及如下核心概念

dag

dag 是airflow中組合工作流的方式。是一些操作/步驟的集合。體現了她們之間的執行順序及依賴關係等。 一般情況下一個dag就對應了一個單獨的工作流(workflow)。

  • Tips:

    airflow會自動的掃描 “.py” 結尾的文件來自動發現dag。默認使用的關鍵字爲“DAG”,”airflow“。如果想自定義可以通過設置DAG_DISCOVERY_SAFE_MODE來讓airflow自動發現所有文件。

scope

airflow 會加載所有它識別到的dag。但是這僅限於python中的global()命名空間中的dag對象,即全局dag。 對於定義在local命名空間如函數中的,可以按考 “subDagOperator“。airflow將不會將其作爲獨立的dag來處理。BTW,一個dag代表着一個workflow(工作流)。

default arguments

可以通過在實例化dag的時候傳遞一個默認參數。這樣可以避免 該dag中的每個operator都單獨配置相關設置項。

default_args = {
    '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

context manager

可以利用python的context manager特性自動將Operator添加到(綁定到)dag上。

# 這裏定義的op不需要指定參數dag=dag來綁定到dag
with DAG('my_dag', start_date=datetime(2016, 1, 1)) as dag:
    op = DummyOperator('op')

op.dag is dag # True

Operators

DAGs定義工作流。Operators來定義具體的工作如何執行。在一個工作流中一個Operator定義一個task。 operator通常是原子的。她們不需要和其他的operator/task交互。dag來定義operator在一個workflow中的執行順序,一個工作流中的operator甚至可能在不同的機器上執行。需要特別關注這一點,以防止在定義dag的時候想當然的依賴operator的執行環境。
如果兩個operator需要共享信息的話,可以通過xComs來實現。

airflow提供了一些常用的Operator:

  1. BashOperator - 執行bash命令
  2. PythonOperator - 可以通過python代碼來定義task內容。
  3. EmailOperator - 發送Email通知(需要在airflow.conf中配置相關信息)
  4. SimpleHttpOperator - 發送http請求
  5. MySqlOperator, SqletOperator, MsSqlOperator, OracleOperator, JdbcOperator - 執行sql操作。
  6. Sensor - 等待一定的時間,file/database,row, s3等(TODO:zzh:沒有太理解)
    只有當Operator綁定到dag上時,airflow纔會加載它。

DAG Assignment

Operators不是必須要立即綁定到dag上。一旦一個operator綁定到來dag上,它就無法解綁或者轉移到別的dag上。

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

# sets the DAG explicitly
explicit_op = DummyOperator(task_id='op1', dag=dag)

# deferred DAG assignment
deferred_op = DummyOperator(task_id='op2')
deferred_op.dag = dag

# inferred DAG assignment (linked operators must be in the same DAG)
inferred_op = DummyOperator(task_id='op3')
inferred_op.set_upstream(deferred_op)

Bitshift Composition

airflow建議通過 移位操作符來表示 一個dag/workflow中的各operator的依賴關係或執行順序。它們的效果和 set_upstram()及set_downstram()效果一樣。
例如:

# 等價
op1 >> op2
op1.set_downstream(op2)

# 等價
op2 << op1
op2.set_upstream(op1)

# 等價
op1 >> op2 >> op3 << op4
op1.set_downstream(op2)
op2.set_downstream(op3)
op3.set_upstream(op4)

# 等價
dag >> op1 >> op2
op1.dag = dag
op1.set_downstream(op2)

# 等價
op1 >> [op2, op3] >> op4
# 和
op1 >> op2 >> op4
op1 >> op3 >> op4
# 和
op1.set_downstream([op2, op3])


# 
with DAG('my_dag', start_date=datetime(2016, 1, 1)) as 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!"))
    )

Relationship Helper

chain 和 cross_downstream 函數在特定情況下給設置operator之間的關係提供了簡便方法

# 等價
[op1, op2, op3] >> op4
[op1, op2, op3] >> op5
[op1, op2, op3] >> op6
cross_downstream([op1, op2, op3], [op4, op5, op6])

# 等價
op1 >> op2 >> op3 >> op4 >> op5
chain(op1, op2, op3, op4, op5)

chain([DummyOperator(task_id='op' + i, dag=dag) for i in range(1, 6)])

#等價
chain(op1, [op2, op3], op4)
op1 >> [op2, op3] >> op4

#等價
chain(op1, [op2, op3], [op4, op5], op6)
op1 >> [op2, op3]
op2 >> op4
op3 >> op5
[op4, op5] >> op6

Task

一旦一個operator被實例化,它就被稱爲一個task。這個class和instances的關係很類似。也就是operator別實例化並稱爲dag/workfow中的一個節點。

Task Instances

Task Instances 是一次特定的task,由 DAG、task 和 timestemp 來唯一標示。當然它也有自己的狀態,如“success”、“failed”、“skipped”等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章