# Apache Airflow 介紹
---
## 1. 什麼是 Apache Airflow?
- ### **Apache Airflow 是「用程式碼管理所有資料流程(Configuration as Code)的平台」**
- 適用於 ETL、資料整合、報表產生、機器學習前後處理等流程。
- 使用者透過 **Python 程式碼** 來 **編寫**、**排程** 和**監控** 數據工作流程。
### 核心組成
Airflow 的運作邏輯是由以下三個核心概念組成的:
1. **流程怎麼走 : DAG (有向無環圖)**:
* 這是任務流程的「藍圖」。所有的任務順序、依賴關係(先做 A,再做 B)都在這裡定義。
2. **工作要怎麼做 : Operator (操作員)**:
* 定義任務「實際做什麼」的模板。
* **Providers**:Airflow 內建 AWS, GCP, Snowflake 等數千種現成的連接器,這是傳統工具較難追上的生態優勢。
3. **實際跑出來的結果 : Task (任務)**:
* 當 DAG 被執行時,Operator 就會被實例化成為一個 Task,並擁有自己的狀態(排程中、執行中、成功、失敗)。
```python
from airflow import DAG
from airflow.decorators import task
from datetime import datetime
import json
from pathlib import Path
with DAG(
dag_id="taskflow_realistic_etl_path_xcom",
start_date=datetime(2024, 1, 1),
# schedule="0 2 * * *",
catchup=False,
tags=["example", "taskflow", "xcom"],
) as dag:
@task
def extract() -> str:
# 實務上:抓 API/DB 後落地成檔案(回傳「路徑」最推薦)
out = Path("/tmp/airflow_demo_extract.json")
out.write_text(json.dumps({"rows": 3, "data": [1, 2, 3]}))
return str(out) # 這個字串會自動進 XCom
@task
def transform(path: str) -> str:
p = Path(path)
payload = json.loads(p.read_text())
# 假裝做轉換:把每個值 * 10
payload["data"] = [x * 10 for x in payload["data"]]
out = Path("/tmp/airflow_demo_transform.json")
out.write_text(json.dumps(payload))
return str(out)
@task
def load(path: str) -> None:
payload = json.loads(Path(path).read_text())
# 實務上:寫入 Doris / Postgres / S3 / Kafka...
print(f"LOAD rows={payload['rows']} data={payload['data']}")
load(transform(extract()))
# e = extract()
# t = transform(e)
# l = load(t)
# e >> t >> l
```
---
## 2. Airflow 平台核心能力
### A. 可擴展的任務執行架構
* **功能**:Airflow 採用「排程控制」與「任務執行」分離的分散式架構設計,任務可以分散執行於多個 Worker 節點,並依需求彈性擴充。
* 實際價值:
- 資料量波動大、尖峰不固定 的工作負載
- 可與容器平台(如 Kubernetes)整合,避免資源長期閒置
- 不同類型的任務(ETL、API、ML)可以並行處理
### B. 流程即程式碼的版本管理能力
* **功能**:Airflow 將所有流程定義為程式碼,天然可納入 Git 等版本控制系統進行管理。
* 實際價值:
- 每一次流程變更都有明確紀錄,方便回溯與審核
- 可安全地重跑歷史資料(Backfill),確保使用的是「當時的流程邏輯」
- 流程修改可以走標準的開發流程(Review / 測試 / 部署)
### C. 多元觸發機制:時間 + 事件
* **功能**:除了傳統的時間排程(Cron),Airflow 也支援以「資料狀態」或「事件」作為流程啟動條件。
* 實際價值:
- 上游資料完成後,下游流程可立即啟動
- 減少不必要的空跑(資料還沒好就先排程)
- 更適合串接資料湖、串流處理或跨系統流程
### D. 清楚可視化的流程監控與錯誤處理
* **功能**:Airflow 提供 DAG 視覺化介面,清楚呈現任務依賴、執行狀態與錯誤位置。
* 實際價值:
- 問題發生時,可以快速定位「卡在哪一個步驟」
- 支援重試、跳過、補跑等操作,降低人工介入成本
- 可與告警系統整合,提升維運可視性
---
## 3. 常見的數據流程管理痛點
| 傳統痛點 | Airflow 解決方案 |
| :--- |:---------------------------------------------------------|
| **GUI 黑箱作業**
流程邏輯藏在圖形介面與設定檔深處,版控困難,難以 Code Review。 | **Configuration as Code**
流程即代碼。邏輯透明、可版控、可測試、可多人協作開發。 |
| **依賴地獄 (Dependency Hell)**
任務 A 失敗,任務 B 卻繼續跑;或跨系統依賴難以管理。 | **DAG 狀態管理**
嚴格的依賴控制,支援複雜的邏輯判斷 (Branching) 與跨 DAG 觸發。 |
| **授權費昂貴**
商用軟體以 Agent 或 Job 數量計費,擴充成本極高。 | **Open Source**
開源免費,無 Agent 數量限制,適合大規模雲端動態擴展。 |
| **人才斷層**
年輕工程師不想學專有的商用工具指令。 | **Python 標準**
使用通用的 Python 語言,人才庫龐大且易於招募。 |
---
## 4. Airflow vs. Control-M
| 比較維度 | **Apache Airflow 3.0** | **BMC Control-M** |
| :--- | :--- | :--- |
| **核心哲學** | **Code-First (代碼優先)**
適合開發者 (Dev) 與資料工程師。 | **Config-First (設定優先)**
適合維運人員 (Ops),以 GUI 拖拉為主。 |
| **版控與協作** | 🏆 **Git Flow 整合**
天生支援 Branch、PR、Code Review 流程。 | **弱**
依賴匯出 XML/JSON 進行版控,難以多人同時開發。 |
| **雲端與生態** | 🏆 **雲原生 (Cloud Native)**
AWS/GCP/Azure 整合極深,容器化支援佳。 | **傳統強項**
強項在 Mainframe (大型主機) 與地端 Legacy 系統。 |
| **成本結構** | **硬體與人力成本**
軟體免費,但需投入工程人力維護。 | **高昂授權費**
按 Job 數或處理器核心計費,擴充昂貴。 |
| **客製化能力** | **無限**
任何 Python 能寫的邏輯都能跑。 | **受限**
需依賴原廠提供的 Plugin 或自行開發複雜腳本。 |
兩者在實務上常並存,依工作負載性質選擇合適工具。
---
## 5. 總結
Airflow 能夠實現:
1. **自動化**:將手動的腳本轉化為自動執行的流程。
2. **標準化**:用統一的 Python 語法定義所有資料處理邏輯。
3. **視覺化**:讓複雜的資料依賴關係變得清晰可見。
4. **可靠性**:自動重試 (Retry)、超時控制 (Timeout) 與 警報通知 (Alerting)。