3. 安装与入门:Airflow 的 pip 安装与 docker-compose 部署;Dagster 的 pip 安装与 dagster dev 启动

说实话,很多人在学调度框架时,第一步就被安装劝退了。我见过不少团队,选型时觉得 Airflow 功能强大,结果装了一周还没跑起来第一个 DAG。Dagster 在这方面确实友好不少,但也不是完全没有坑。

这一章,咱们就动手把两个框架装起来。我会把两种方式都走一遍——pip 快速安装和docker-compose 部署。你跟着做就行,不用纠结选哪个,我建议你本地开发用 pip,团队协作用 Docker。

3.1 Airflow 的 pip 安装

Airflow 的 pip 安装,说白了就是一条命令的事。但为什么很多人装完就报错?嗯,这里要注意一个关键点:依赖冲突。

我个人习惯在虚拟环境里装 Airflow,避免污染全局 Python。你可以用 venv 或者 conda,都行。

# 创建虚拟环境(Python 3.8-3.11 都支持)
python -m venv airflow_env
source airflow_env/bin/activate  # Windows 用 airflow_env\Scripts\activate

# 设置 Airflow 家目录(我习惯放在 ~/airflow)
export AIRFLOW_HOME=~/airflow

# 安装 Airflow(指定版本,避免踩坑)
pip install apache-airflow==2.8.1

# 初始化数据库
airflow db init

# 创建管理员用户
airflow users create \
    --username admin \
    --firstname Admin \
    --lastname User \
    --role Admin \
    --email admin@example.com \
    --password admin

# 启动 web 服务(默认端口 8080)
airflow webserver --port 8080

# 新开终端,启动调度器
airflow scheduler
我曾经踩过的坑:直接 pip install apache-airflow 不指定版本,结果装了个 2.9.0,跟某些 provider 包不兼容。调度器一直报 ModuleNotFoundError,查了半天才发现是版本问题。所以,一定要指定版本号。

装完之后,打开浏览器访问 http://localhost:8080,用刚才创建的账号登录。你会看到 Airflow 的 UI 界面——嗯,说实话,第一眼感觉有点老气,但功能都在。

3.2 Airflow 的 docker-compose 部署

如果你不想折腾虚拟环境,或者需要多人共享一个环境,Docker 是更好的选择。Airflow 官方提供了 docker-compose 文件,但说实话,那个文件有 200 多行,看着就头大。

我建议你直接用我简化过的版本:

# 创建项目目录
mkdir airflow-docker && cd airflow-docker

# 下载官方 docker-compose 文件(精简版)
curl -LfO 'https://raw.githubusercontent.com/apache/airflow/2.8.1/docker-compose.yaml'

# 创建必要的目录
mkdir -p ./dags ./logs ./plugins ./config

# 设置当前用户 ID(避免文件权限问题)
echo -e "AIRFLOW_UID=$(id -u)" > .env

# 启动所有服务
docker-compose up -d

# 查看启动状态
docker-compose ps

启动后,同样访问 http://localhost:8080。默认账号密码都是 airflow。

小技巧:docker-compose 方式启动后,你的 DAG 文件放在 ./dags 目录下。修改后不用重启容器,Airflow 会自动扫描加载。我平时开发就用这种方式,改完代码直接刷新页面就能看到效果。

你想想看,docker-compose 方式其实把很多脏活累活都封装好了。数据库(PostgreSQL)、消息队列(Redis)、Web 服务、调度器、执行器……全在一个 docker-compose 文件里搞定。但代价就是——资源占用高。我本地 16G 内存的机器,跑起来风扇呼呼转。

3.3 Dagster 的 pip 安装

Dagster 的安装就轻量多了。我第一次装的时候,感觉像在装一个普通的 Python 库,完全没有 Airflow 那种「大工程」的感觉。

# 创建虚拟环境
python -m venv dagster_env
source dagster_env/bin/activate

# 安装 Dagster 核心库和 UI
pip install dagster dagster-webserver

# 验证安装
dagster --version

就这么简单?对,就这么简单。Dagster 的设计哲学就是「开发者友好」,安装过程几乎没有依赖冲突。我试过在 Python 3.9、3.10、3.11 上装,都没出过问题。

但这里有个容易忽略的点:Dagster 的 UI 是独立的包。如果你只装了 dagster,是看不到 Web 界面的。必须装 dagster-webserver 或者 dagit(旧版名称)。

核心区别:Airflow 的 Web 服务是内置的,装完就有。Dagster 的 UI 是可选组件,需要单独安装。这反映了两个框架的设计理念——Airflow 偏向「全家桶」,Dagster 偏向「模块化」。

3.4 Dagster 的 dagster dev 启动

装完之后,启动方式也跟 Airflow 完全不同。Dagster 提供了一个开发命令 dagster dev,一条命令就能同时启动 Web 服务和代码加载器。

# 创建项目目录
mkdir dagster-project && cd dagster-project

# 创建你的第一个 Dagster 代码文件
touch my_job.py

# 启动开发模式
dagster dev -f my_job.py

打开浏览器访问 http://localhost:3000,你会看到 Dagster 的 UI。说实话,第一次看到这个界面时,我有点惊讶——比 Airflow 好看太多了。现代化的设计,交互流畅,还有实时日志流。

为什么会这样?因为 Dagster 是 2019 年才发布的,UI 用的是 React + TypeScript 重写的。而 Airflow 的 UI 还是 Flask + Bootstrap 的老架构,虽然 2.0 之后有改进,但底子摆在那里。

我建议你这样做:开发阶段用 dagster dev,它会自动监听文件变化,改完代码立刻生效。生产环境再用 dagster-webserver + dagster-daemon 的组合。这样开发体验和生产稳定性都能兼顾。

3.5 两种安装方式的对比

我把两种框架的安装方式整理成了一张表,方便你对比:

对比维度 Airflow Dagster
pip 安装复杂度 中等(依赖多,易冲突) 简单(依赖少,几乎无冲突)
pip 安装后启动 需分别启动 webserver + scheduler 一条命令 dagster dev
docker-compose 部署 官方提供,但文件复杂(200+ 行) 官方提供,文件简洁(约 50 行)
UI 访问端口 8080 3000
首次启动时间 约 2-3 分钟(含数据库初始化) 约 10 秒
资源占用(本地) 高(约 2-3GB 内存) 低(约 500MB 内存)

你看这张表,Dagster 在「开发者体验」上确实下了功夫。但别急着下结论——Airflow 的复杂是有原因的,它要兼容更多的执行环境和历史版本。说白了,Airflow 是「老大哥」,稳重但有点笨重;Dagster 是「新秀」,轻快但生态还在成长。

3.6 安装流程总览

为了让你对整个安装流程有个全局认识,我画了一张图:

Airflow vs Dagster 安装流程对比 Airflow pip install apache-airflow airflow db init airflow users create 启动 webserver + scheduler ⚠ 需要两个终端窗口 或使用 docker-compose Dagster pip install dagster pip install dagster-webserver dagster dev -f my_job.py ✅ 一条命令启动所有服务 自动监听文件变化 结论:Dagster 安装更轻量,Airflow 部署更成熟

从这张图你能直观地看到:Airflow 的安装流程有 4 步,Dagster 只有 3 步。而且 Dagster 的最后一步是「一条命令启动所有」,Airflow 却要分别启动两个服务。这就是为什么我说 Dagster 对开发者更友好。

3.7 避坑指南

最后,我把自己踩过的坑总结一下,你遇到类似问题可以直接翻到这里:

  • Airflow 数据库初始化失败:检查 SQLite 版本,低于 3.15 会报错。我建议直接用 PostgreSQL,省心。
  • Dagster 端口被占用:dagster dev 默认用 3000 端口,如果被占用了,用 dagster dev -p 3001 指定其他端口。
  • docker-compose 权限问题:Airflow 的 Docker 容器默认以 root 运行,生成的日志文件权限是 root。设置 AIRFLOW_UID 环境变量可以解决。
  • Dagster 找不到代码文件:dagster dev -f 后面要跟 Python 文件路径,不是目录。如果要加载整个目录,用 dagster dev -w workspace.yaml。