1. Dagster 初探:为什么需要 Dagster?它解决了什么痛点?与其他调度工具(Airflow、Prefect)的对比
说实话,我接触数据管道调度工具已经快十年了。从最早的 Cron 脚本,到后来用 Airflow 搭建复杂工作流,再到最近两年深度使用 Dagster。每次切换工具,都是因为遇到了实实在在的痛点。
这一章,我想跟你聊聊:为什么我们需要 Dagster?它到底解决了什么问题? 我会结合自己的踩坑经历,帮你快速建立对 Dagster 的认知框架。
1.1 数据管道的「脏活累活」:我们到底在烦恼什么?
先别急着看工具对比。你想想看,一个典型的数据管道,除了写 SQL 和 Python 脚本,我们还要处理多少破事?
- 依赖管理混乱:表 A 跑完才能跑表 B,但脚本里全是硬编码的 sleep 和轮询。
- 失败重试全靠手工:凌晨三点管道挂了,爬起来手动 rerun,第二天顶着黑眼圈上班。
- 数据质量没人管:管道跑完了,但数据是脏的、空的、重复的,下游报表全废。
- 资源利用率低:所有任务挤在一个大机器上跑,要么抢资源,要么空转。
- 调试像破案:日志散落在不同服务器,想查一个任务的输入输出,得翻半天。
我在一家电商公司带数据团队时,就吃过这种苦头。当时我们用 Airflow 管理 200 多个 DAG,每天跑 3000 多个任务。表面上看挺风光,实际上——
核心痛点:调度工具只负责「什么时候跑」,不关心「跑得对不对」「数据好不好」。管道是黑盒,出了问题只能靠人肉排查。
说白了,传统调度工具把「数据管道」当成了「任务调度」问题。但现实是,数据管道首先是数据问题,然后才是调度问题。
1.2 Dagster 的核心理念:从「任务调度」到「数据感知」
Dagster 的创始人 Nick Schrock 说过一句话,我印象特别深:「We're not building a scheduler, we're building a data platform.」
什么意思呢?Dagster 把数据管道拆解成三个核心概念:
- Assets(数据资产):管道产出的每一张表、每一个文件、每一个模型,都是明确的「资产」。
- Ops(操作):对数据资产执行的具体操作,比如清洗、聚合、训练。
- Jobs(作业):把 Ops 和 Assets 编排成可执行的流程。
这个设计有什么好处?我举个例子。
在 Airflow 里,你定义一个 DAG,里面是 task_a → task_b → task_c。如果 task_b 失败了,你只知道「task_b 挂了」,但不知道它影响了哪张表、下游谁依赖它。
在 Dagster 里,每个 Op 都明确声明了「我消费哪些 Asset」「我产出哪些 Asset」。管道不再是黑盒,而是一张数据血缘图。
我的习惯:每次设计新管道,我会先画出数据资产地图,再写 Op 代码。Asset-first 的思路,能帮你避免很多后期返工。
1.3 一张图看懂 Dagster 的核心架构
下面这张图,是我给团队做培训时常用的。它展示了 Dagster 如何把「数据」和「计算」解耦,让管道变得可观测、可测试。
1.4 实战对比:Airflow vs Prefect vs Dagster
我知道你肯定想问:Dagster 和 Airflow、Prefect 到底有什么区别? 我三个都用过,直接说结论:
| 维度 | Airflow | Prefect | Dagster |
|---|---|---|---|
| 核心抽象 | DAG(有向无环图) | Flow / Task | Asset / Op / Job |
| 数据感知 | 弱(任务间只传 metadata) | 中(支持结果缓存) | 强(原生 Asset 血缘) |
| 本地开发 | 差(需要启动完整环境) | 好(轻量级测试) | 极好(支持 Jupyter 调试) |
| 失败重试 | 基础(task 级别) | 高级(自动重试 + 回退) | 高级(可自定义重试策略) |
| 数据质量 | 无原生支持 | 无原生支持 | 内置 Asset 检查 |
| UI 体验 | 功能丰富但臃肿 | 简洁现代 | Dagit 极简且可交互 |
| 社区生态 | 最成熟 | 快速增长 | 中等但活跃 |
我曾经踩过的坑:在 Airflow 里,我为了追踪一张表的血缘关系,不得不写一堆自定义的 XCom 逻辑。后来迁移到 Dagster,同样的需求,只需要在 Asset 定义里加一行 group_name 就搞定了。嗯,这就是「数据感知」和「任务调度」的本质区别。
1.5 什么时候该选 Dagster?
不是所有场景都适合 Dagster。我建议你根据以下条件判断:
- 适合:管道复杂、数据血缘要求高、需要频繁调试和重跑、团队注重数据质量。
- 不适合:只有几个简单的 ETL 脚本、团队对 Airflow 已经很熟练且没有痛点、基础设施要求极简。
我个人习惯是:只要管道超过 10 个任务,或者涉及 3 张以上的表,我就会用 Dagster。前期多花半小时配置,后期能省下无数个凌晨三点。
1.6 本章小结
这一章我们聊了:
- 数据管道的常见痛点:依赖混乱、失败重试、数据质量、调试困难。
- Dagster 的核心理念:从「任务调度」转向「数据感知」,用 Asset 作为一等公民。
- 与 Airflow、Prefect 的对比:Dagster 在数据血缘、本地开发、数据质量方面有明显优势。
- 选型建议:复杂管道优先考虑 Dagster,简单场景不必强求。