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 如何把「数据」和「计算」解耦,让管道变得可观测、可测试。

Dagster 核心架构:数据感知的管道 原始数据表 清洗后数据 聚合指标表 ML 特征表 数据资产 (Assets) extract_raw clean_data aggregate train_model 操作 (Ops) 调度器 (Cron / 事件触发) Dagit UI (实时观测 & 调试) 数据质量检查 平台能力 每个 Op 明确声明输入/输出 Asset,管道不再是黑盒,而是可观测的数据血缘图

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,简单场景不必强求。