跑起第一個 Airflow:Docker 環境 + 你的第一個 DAG
· tech
#airflow#data-engineering#docker
上一篇把 Airflow 的概念與架構講清楚了;這篇動手把它在本機跑起來,寫出第一個 DAG,並在 Web UI 上看著它跑完。目標很單純:從零到「我親眼看到自己的 DAG 在介面上變綠」。
兩種起法:先選一個
| 方式 | 指令 | 適合 |
|---|---|---|
airflow standalone | pip install apache-airflow 後一行啟動 | 只想快速摸 DAG、不在意元件 |
| 官方 Docker Compose | 一份 compose 檔起整套 | 想看到真實多元件架構(scheduler / worker / DB) |
學習階段我推薦直接用 Docker Compose —— 它把 上一篇講的 Scheduler、Worker、Metadata DB 全變成你看得到、摸得到的容器,概念才會落地。
用 Docker Compose 起 Airflow
# 1. 抓官方 compose 檔
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml'
# 2. 建掛載資料夾,並設定 UID(Linux/macOS)
mkdir -p ./dags ./logs ./plugins ./config
echo "AIRFLOW_UID=$(id -u)" > .env
# 3. 初始化:建 metadata DB、建 admin 帳號
docker compose up airflow-init
# 4. 起整套(背景執行)
docker compose up -d
跑完打開 http://localhost:8080,用預設帳密 airflow / airflow 登入,就看到 Airflow 的 Web UI 了。這份 compose 會起這些服務:
(背後還有 Postgres 當 metadata DB、Redis 當 Celery 的 broker —— 這份官方 compose 用的是 CeleryExecutor,所以多了 worker 與 redis。)
踩到
env file … /.env not found? 多半是docker-compose.yaml、.env、dags/沒放在同一層。docker compose在當前資料夾找不到 compose 檔時會往上層找,並把專案目錄設成上層,連帶去上層找.env(於是錯誤裡的路徑會是你上一層的目錄)。解法:確保三者都在同一個資料夾,而且從那個資料夾執行docker compose。另外,FERNET_KEY … not set只是警告 —— 官方 compose 寫死空字串,本機學習可忽略。
寫你的第一個 DAG
在剛剛建的 ./dags/ 裡新增 hello_airflow.py:
from datetime import datetime
from airflow.decorators import dag, task
@dag(
schedule=None, # 先不排程,純手動觸發
start_date=datetime(2026, 1, 1),
catchup=False, # 別自動回補過去(學習期務必設 False)
tags=["tutorial"],
)
def hello_airflow():
@task
def say_hello() -> str:
return "hello"
@task
def shout(word: str) -> None:
print(f"{word.upper()}!") # 在 task log 裡會看到 HELLO!
shout(say_hello())
hello_airflow()
存檔後什麼都不用做 —— Scheduler 每隔一小段時間會掃 ./dags/,大約 30 秒內,hello_airflow 就會自己出現在 Web UI 的 DAG 列表裡。這個「改檔案 → 自動出現」的瞬間,就是 Airflow 從抽象變具體的時刻。
在 Web UI 跑一輪
- 打開開關:DAG 列表左邊有個 toggle,新 DAG 預設是暫停的,點亮它。
- 手動觸發:右邊的 ▶(Trigger DAG)按下去。
- 看 Graph / Grid:點進 DAG,Graph 檢視會看到
say_hello → shout兩個方塊依序變綠。 - 看 log:點任一個 task → Logs,會看到
shout印出的HELLO!。 - 重跑:對 task 按 Clear,它會重新跑一次 —— 這就是 上一篇說的「可重試」最直觀的體驗。
反思
docker-compose 很適合「學」,但它不是 production
官方那份 compose 檔開頭就寫明 “not suitable for production”。它的價值是讓你一次看到所有元件(scheduler、worker、redis、postgres 全在那),對理解架構很棒;但它也很重,而且預設配置不是拿來上線的。我的建議:用它來「看懂整套怎麼運作」,真要部署再走 managed(MWAA / Astronomer)或正式的 K8s 部署 —— 別把學習用的 compose 直接搬上 production。
第一個坑幾乎都是「DAG 沒出現」
新手最常卡在「我存檔了,UI 卻沒出現我的 DAG」。九成是 DAG 檔本身有 parse error —— Scheduler 匯入失敗,DAG 自然不會出現。解法很固定:看 UI 上方的 Import Errors,或去翻 scheduler 的 log。記住 上一篇提過的:DAG 檔的 top-level 會被反覆 import,所以那層不要放會出錯或很慢的程式碼。
catchup=False 是學習期的保命符
start_date 設在過去 + catchup=True(預設)會讓 Airflow 一啟用就狂補跑從 start_date 到現在的每一個排程,瞬間塞爆。學習階段一律先 schedule=None 或 catchup=False,等真的搞懂 排程模型再開 —— 這也正好是下一篇要拆解的主題。