You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

6.4 KiB

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,並擁有自己的狀態(排程中、執行中、成功、失敗)。
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)。