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。
./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(旧版名称)。
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 的安装流程有 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。