二、Apache Airflow 基本介紹
Airflow 的基礎名詞:DAG、Tasks、Operators、Hooks、Relationship。Airflow 的四大組成元件(components):Webserver、Scheduler、Executor、Metadata database
這系列的文章源自我 2023/9/16-2023/10/15 參加的 iT 鐵人賽:
2023 鐵人賽系列文章:Airflow 是什麼? 能吃嗎 ? 數據水管工的超級蘑菇
Airflow 的基礎名詞
DAG:有向無環圖
全名是 Directed Acyclic Graph,中文翻作有向無環圖,白話文就是有方向(Directed)不會有循環(Acyclic)的圖,簡稱為 DAG,就像上方的圖一樣,用途是決定每個任務節點之間的順序和關係,並設計工作流程如何運作。
DAG 每次執行都會實例化(Instantiate)出一個 DAG run,其中包含 DAG 的基礎設定,例如遇到錯誤要重試幾次,每次間距要多久等等
Tasks:工作任務
每個 DAG 裡面都有無數個 Tasks(工作任務),每個任務可以想成是完成一件事,就像是上面圖的當中的run_this_first
、branching
的節點,對應到 Python 的程式就是一個個的 Function。
Operators:操作員 / 操作符
在 airflow 當中,Operators 又是更小的單位,一個 Tasks 當中可能有多個 Operators,Operators 通常會負責很特定的任務,所有的 Operators 都是繼承 BashOperator 所設計出來的類別,舉例一些特定的工作就很好理解了:
- BashOperator: 執行 bash 指令
- PythonOperator:呼叫 Python 的函數
- EmailOperator:傳送 Email 的通知
- MySqlOperator:操作與連接 MySQL
- BigQueryOperator:執行 BigQuery 的 SQL 指令
通常 Operator 可以分成三種主要類型:
- 運行直到滿足特定條件
- 使用不同軟體或系統的功能
- 傳遞資料
Hooks:鉤子/ 接口
Hooks 可以和第三方系統互動,第三方系統是什麼?就是非官方和運營方開發的系統,例如我們要把 Airflow 和 MySQL 溝通,就必須要用到 Hooks 幫助我們傳遞資料進到 Airflow,最後出去也需要 Hooks 才能送出。
和平常我們常常聽到的 webhook 不太一樣, webhook 比較像監聽的機制,如果xx事情發生記得通知我,像是「按讚、訂閱、開啟小鈴鐺」的小鈴鐺,就是youtuber發片的時候可以收到通知,如果對於 webhook 還是有點模糊,推薦看這篇文章 卡米狗:認識 Webhook 。
Relationship:節點關係
在任務之間,我們可以定義前後順序和相互關係,甚至將多個任務包再一起成為 task_group,定義上有多種不同方式,像這樣:
task1 >> task2 >> task3
task3(task2(task1))
task1.set_downstream(task2)
task3.set_upstream(task2)
- 這三種都是代表先做 task1,接著 task2,再來 task3
task_group 會像這樣
[task1 ,task2] >> task3
- 代表要先做完 task1、task2,接著才會做 task3
- 而且 task1、task2 的執行是同時發生的
- task_group 當中也可能會有更複雜有順序相依性的行為
Airflow 的四大組成元件(components)
Webserver:網頁伺服器 / 使用者介面
Airflow 的使用者介面,就是我們前幾天安裝完開啟的網頁 (http://localhost:8080) ,可以在上面讀取各項紀錄檔。
Scheduler:排程調度器
監控所有 DAGs 和相關的任務,調度目前該哪一個 task 執行,接下來又換哪一個。
Executor:執行器
專注在執行任務,有多種不同類型,例如:LocalExecutor、CeleryExecutor 和 KubernetsExecutor。
之後有機會再詳細介紹,這部分我也只熟悉 Local 和 Celery。
Metadata database:描述檔資料庫
Metadata before Metadata database
我們先來認識 metadata,這個詞也會常常看到,通常翻作「詮釋資料」或「後設資料」,意思就是「描述xx資料」的「資料」,好繞口,就像是一本書的序,就是描述文字的文字,這樣有類比到嗎(臨時想的XD),反正通常網頁的 header 裡面有 meta tag,就是描述網頁的 summary,專門給搜尋引擎(google)看的,這樣就可以加快搜尋引擎認識你的網站,所以你看到各種 dataset (資料集),常常會看到 metadata,就是在介紹這個資料集的資料。
所以這裡的 Metadata database 是什麼,就是當你在運行 Airflow 時,Airflow 當中的預設值,和你接下來的所有行為都會被記錄在個資料庫,所以他並不是你實際在處理的資料庫,而是紀錄你是如何處理資料的資料庫,哈哈,也是好繞口,在這裡會儲存所有元件的互動方式和目前的狀態,每次開始運行 Airflow,也是從這邊讀取過去的運行資料出去。
其他類似 Airflow 的工具
- Spotify 的 Luigi(路易吉):這個名字很適合水管工誒,1.68k stars / 4k commits
https://github.com/spotify/luigi - LinkedIn 的 Azkaban(阿茲卡班): 4.3k stars / 3k commits
https://github.com/azkaban/azkaban - Netflix 的 Conductor: 10.7k stars / 3k commits
https://github.com/Netflix/conductor - Apache也有另外兩個工具能做到類似的工作流,Apache Beam、Apache Oozie