1. Dagster 初探:什么是 Dagster?
说实话,我第一次接触 Dagster 的时候,心里想的是:「又来了一个调度框架?」
那时候团队里已经跑着 Airflow,Prefect 也在几个小项目里试过水。但真正让我停下来认真看 Dagster 的,是它提出的那个概念——软件定义资产(Software-Defined Assets)。嗯,这个思路确实不一样。
1.1 什么是 Dagster?
Dagster 是一个开源的数据编排平台。你可以把它理解成一个专门为数据管道设计的操作系统。它不光管「什么时候跑」,还管「跑什么」、「数据长什么样」、「失败了怎么排查」。
我个人的理解是:Dagster 把数据管道从「一堆脚本拼起来」变成了「可观测、可测试、可复用的数据资产」。你想想看,传统的数据管道,你写一堆 Python 函数,用装饰器串起来,然后交给调度器去跑。但 Dagster 不一样,它让你先定义数据资产,再定义怎么产出这些资产。
核心区别:传统框架关注「任务执行顺序」,Dagster 关注「数据资产的血缘和状态」。
1.2 Dagster vs Airflow vs Prefect
我在项目中用过这三者,简单说说我的感受。
| 维度 | Airflow | Prefect | Dagster |
|---|---|---|---|
| 核心抽象 | DAG(有向无环图) | Flow / Task | 软件定义资产 + 作业 |
| 数据感知 | 弱(需要额外工具) | 中(有上下文传递) | 强(资产原生感知) |
| 测试友好度 | 低(依赖数据库) | 中(本地可跑) | 高(纯 Python 可测) |
| UI 体验 | 功能全但老旧 | 现代但偏重 | 简洁、数据血缘可视化 |
| 部署复杂度 | 高(Celery + Redis + DB) | 中(Server + Agent) | 低(单进程可跑) |
| 社区生态 | 最成熟 | 成长中 | 快速增长 |
我曾经在一个数据湖项目中用 Airflow 管理 200+ 个 DAG。每次排查数据质量问题,都要在 Airflow 的日志里翻半天,然后去查上游表是谁更新的。说白了,Airflow 只管「任务跑没跑」,不管「数据对不对」。
Prefect 好一些,它引入了状态管理和重试机制。但它的核心抽象还是「任务」,数据本身仍然是隐式的。你很难一眼看出某个表是由哪些上游数据加工而来的。
Dagster 不一样。它把「数据」放在第一位。你定义的不是任务,而是数据资产。每个资产都知道自己依赖谁、被谁依赖。这个思路,我个人觉得更贴近数据工程师的日常工作——我们每天打交道的就是表、文件、模型,而不是任务。
我的建议:如果你的团队刚起步,管道数量少于 20 条,Prefect 或 Dagster 都行。如果管道超过 50 条,且数据血缘是刚需,直接上 Dagster。
1.3 核心设计理念:软件定义资产
这是 Dagster 最让我眼前一亮的东西。什么叫软件定义资产?说白了,就是用代码来声明式地定义你的数据产物。
传统做法是这样的:
# 传统方式:定义任务
def extract():
# 从 API 拉数据
pass
def transform():
# 清洗数据
pass
def load():
# 写入数据库
pass
Dagster 的做法:
# Dagster 方式:定义资产
from dagster import asset
@asset
def raw_sales_data():
"""原始销售数据"""
# 从 API 拉数据
return api_data
@asset
def cleaned_sales_data(raw_sales_data):
"""清洗后的销售数据"""
# 清洗数据
return clean_data
@asset
def sales_metrics(cleaned_sales_data):
"""销售指标"""
# 计算指标
return metrics
你发现区别了吗?在 Dagster 里,每个函数的参数就是它依赖的上游资产,返回值就是它产出的资产。Dagster 会自动构建出完整的数据血缘图。
我记得有一次,业务方问「这个报表里的销售额是怎么算出来的?」。在 Dagster 的 UI 里,我直接点开资产的血缘图,从报表一路追溯到原始数据源,每个转换步骤都清清楚楚。这在 Airflow 里,你得翻多少个 DAG 定义才能搞清楚?
注意:软件定义资产不是银弹。如果你的数据管道极其简单(比如就一个 ETL 脚本),用 Dagster 反而有点重。它最适合的场景是:多个数据源、多层转换、多个下游消费方的复杂数据环境。
1.4 知识体系总览
下面这张图展示了本章的核心知识结构。我把它画出来,方便你建立整体认知。
1.5 为什么选择 Dagster?
说了这么多,到底什么场景下该选 Dagster?我总结了几点:
- 数据血缘是刚需:你需要清楚地知道每个数据产物的来源和去向。Dagster 原生支持,不需要额外工具。
- 团队注重测试:Dagster 的资产函数是纯 Python,可以单元测试、集成测试,不需要 mock 调度器。
- 管道复杂度高:有多个数据源、多层转换、多个下游消费方。Dagster 的资产图能帮你理清关系。
- 希望降低运维成本:Dagster 可以单进程运行,开发环境和生产环境切换成本低。
避坑指南:我曾经在一个小团队里强行推 Dagster,结果大家觉得学习曲线太陡,最后还是用回了 Airflow。所以我的建议是:先在一个中等复杂度的管道上试点,让团队看到数据血缘可视化带来的好处,再逐步推广。
好了,这一章我们聊了 Dagster 是什么、它和 Airflow/Prefect 的区别、以及软件定义资产这个核心设计理念。你可能会觉得概念有点多,没关系,后面我们会一步步动手实践,把这些概念落地成代码。