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 知识体系总览

下面这张图展示了本章的核心知识结构。我把它画出来,方便你建立整体认知。

Dagster 初探:知识体系 Dagster 什么是 Dagster 与 Airflow/Prefect 对比 软件定义资产 数据编排 可观测性 核心抽象 数据感知 声明式定义 血缘追踪 Dagster 的核心创新: 从「任务编排」转向「数据资产编排」

1.5 为什么选择 Dagster?

说了这么多,到底什么场景下该选 Dagster?我总结了几点:

  • 数据血缘是刚需:你需要清楚地知道每个数据产物的来源和去向。Dagster 原生支持,不需要额外工具。
  • 团队注重测试:Dagster 的资产函数是纯 Python,可以单元测试、集成测试,不需要 mock 调度器。
  • 管道复杂度高:有多个数据源、多层转换、多个下游消费方。Dagster 的资产图能帮你理清关系。
  • 希望降低运维成本:Dagster 可以单进程运行,开发环境和生产环境切换成本低。

避坑指南:我曾经在一个小团队里强行推 Dagster,结果大家觉得学习曲线太陡,最后还是用回了 Airflow。所以我的建议是:先在一个中等复杂度的管道上试点,让团队看到数据血缘可视化带来的好处,再逐步推广。

好了,这一章我们聊了 Dagster 是什么、它和 Airflow/Prefect 的区别、以及软件定义资产这个核心设计理念。你可能会觉得概念有点多,没关系,后面我们会一步步动手实践,把这些概念落地成代码。