[AirFlow]AirFlow使用指南四DAGOperatorTask
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:DockerOperator
,HiveOperator
,S3FileTransferOperator
,PrestoToMysqlOperator
,SlackOperator
…總之你能想到的!
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特定執行相關的狀態
通過組合DAG
和Operators
來建立TaskInstances
,可以構建複雜的工作流。
相關文章
- Airflow學習筆記 --- airflow安裝AI筆記
- airflow practiceAI
- Apache Airflow 2.3.0 釋出ApacheAI
- Airflow使用入門指南AI
- Airflow 實戰軍規AI
- Airflow 任務排程AI
- 大資料技術 - Airflow大資料AI
- Airflow 2正式出來了AI
- 使用 Airflow 替代你的 crontabAI
- Airflow 中文文件:快速開始AI
- [譯] Robinhood 為什麼使用 AirflowAI
- Apache Airflow十條最佳實踐ApacheAI
- airflow DAG/PIPELINE examples referenceAI
- Airflow替代方案:Prefect和Dagster比較AI
- [譯] 理解 Apache Airflow 的關鍵概念ApacheAI
- Airflow 中文文件:用Dask擴充套件AI套件
- MacChromecast遠端播放工具——Airflow for MacMacChromeASTAI
- airflow2.0.2分散式安裝文件AI分散式
- [譯] Airflow: 一個工作流程管理平臺AI
- DolphinDB +Python Airflow 高效實現資料清洗PythonAI
- 透過API觸發airflow的DAG任務APIAI
- airflow 進行後端大資料中ETL處理(草稿)AI後端大資料
- DBT、Airflow 和 Kubernetes的架構演進 - yanAI架構
- 工作流排程工具Airflow1.8搭建及使用AI
- 大規模執行 Apache Airflow 的經驗教訓 - shopifyApacheAI
- Airflow vs. Luigi vs. Argo vs. MLFlow vs. KubeFlowAIUIGo
- [譯] 從 Cron 到 Airflow 的遷移中我們學到了什麼AI
- [譯] Python 與大資料:Airflow、 Jupyter Notebook 與 Hadoop 3、Spark、PrestoPython大資料AIHadoopSparkREST
- 史上最全面 centos7安裝 apache-airflow(2020-09-30)CentOSApacheAI
- Pinterest為何遷移到新的大資料處理工作流平臺Apache Airflow?REST大資料ApacheAI
- 資料流程式設計教程:如何使用Airflow構建資料科學工作流程式設計AI資料科學
- RecyclerView使用指南(四)—— 使用ItemDecorationView
- Nuxt框架中內建元件詳解及使用指南(四)UX框架元件
- SQLT 使用指南SQL
- Lombok使用指南Lombok
- Rundeck使用指南
- git使用指南Git
- gulp 使用指南