
5 件套 stars 总和 102K · 4/5 Apache-2.0 · 3 层架构(入仓 / 编排 / 仓内转换) · 35 分钟跑通 GitHub API → Snowflake 完整 ELT
写在前面: 数据集成市场的 ”3 大层 ” 分工
2026 年企业数据栈的 主流范式已经定型 —— 不再是 ” 一个工具打天下 ”, 而是 3 层职责分明:
┌─────────────────────────────────────────────────┐
│ L1 · 入仓层 (Extract + Load) │
│ → Airbyte / dlt / Meltano / Fivetran │
│ → 负责: 数据源连接 + 拉到数据仓库 │
└──────────────────┬──────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ L2 · 编排层 (Orchestration) │
│ → Airflow / Dagster / Prefect │
│ → 负责: 依赖管理 + 调度 + 重试 + 监控 │
└──────────────────┬──────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ L3 · 仓内转换层 (Transform) │
│ → dbt-core / sqlmesh / Coalesce │
│ → 负责: 数据建模 + SQL 转换 + 血缘 + 测试 │
└─────────────────────────────────────────────────┘
为什么是 3 层不是 1 个?
- 入仓 是 IO 密集, 关心 connector 数量 + 数据规模
- 编排 是控制流, 关心 DAG 表达 + 调度 + 故障恢复
- 转换 是计算密集, 关心 SQL 表达力 + 血缘 + 测试
强行用 1 个工具做 3 件事, 要么像 Airflow 一样变得臃肿, 要么像 Airbyte 一样表达力不足。3 层各司其职 + 自由组合 是 2026 年最佳实践。
本篇调研的 5 件套各占一层 / 一类:
| 层 | 工具 |
|---|---|
| 入仓层 (L1) | Airbyte 326 |
| 编排层 (L2) | Airflow 306 + Dagster 390 |
| 转换层 (L3) | dbt-core 290 + sqlmesh 292 |
刚好 5 件套, 把数据集成 3 层全打通。
一、5 大主角速览
| # | 项目 | Stars | License | 主语言 | 最新版 | 最近更新 | 角色 | 维度 |
|---|---|---|---|---|---|---|---|---|
| 1 | Apache Airflow | 46,609 | Apache-2.0 ✅ | Python | v3.x | 今天 push | 🟢 工作流编排老炮 | L2 编排 |
| 2 | Airbyte | 21,957 | NOASSERTION ⚠️ | Python + Java | v2.0.0 | 今天 push | 🟢 ETL 平台龙头 | L1 入仓 |
| 3 | Dagster | 16,065 | Apache-2.0 ✅ | Python | v1.x | 今天 push | 🟢 现代 Asset-centric | L2 编排 |
| 4 | dbt-core | 13,694 | Apache-2.0 ✅ | Rust ⚡ | v1.x | 今天 push | 🟢 ELT 转换事实标准 | L3 转换 |
| 5 | sqlmesh | 3,255 | Apache-2.0 ✅ | Python | v0.236.1 | 7/24 (1 个月前) | 🟢 dbt 替代新星 | L3 转换 |
5 开源 stars 总和:101,580 ⭐
License 分布(5 个工具):
- Apache-2.0 ✅:4 个(Airflow / Dagster / dbt-core / sqlmesh)—— 4/5 干净
- NOASSERTION ⚠️:1 个(Airbyte)—— 自托管需逐 connector 审查
3 个关键信号:
- Airflow 47K stars 是绝对龙头, 工作流编排事实标准
- dbt-core 是 Rust 写 ⚡ —— 不是 Python(2024-2025 重构)
- sqlmesh 仓库从
TobikoData/sqlmesh改名SqlMesh/sqlmesh—— 2026 品牌独立
二、3 大层职责深度对比
L1 · 入仓层 (Extract + Load)
| 维度 | Airbyte | (dlt) | (Meltano) |
|---|---|---|---|
| 形态 | 平台(UI + 自托管) | Python 库 | CLI + YAML |
| Connector | 600+ ⭐ | 30+ | 300+ Singer |
| 数据规模 | TB-PB ✅ | GB-MB | GB-TB |
| License | NOASSERT ⚠️ | Apache-2.0 ✅ | MIT ✅ |
入仓层核心结论:Airbyte 是企业大数据的入仓龙头, 但License 风险最高。中小数据用 dlt(库范式),DataOps 团队用 Meltano(Singer spec 范式)。详见 ETL 工具横评 411。
L2 · 编排层 (Orchestration)
| 维度 | Apache Airflow | Dagster |
|---|---|---|
| Stars | 46,609 ⭐ | 16,065 |
| 范式 | DAG(Task Graph) | Asset-centric(数据资产) |
| 核心抽象 | DAG / Task / Operator | Asset / Op / Job / Resource |
| 调度 | Cron + executor(Celery/K8s) | 内置 + 多种 run launcher |
| 测试 | Unit + DAG 验证 | 内置 Asset 单元测试 ⭐ |
| 可观测性 | Gantt + Log | Asset lineage + Run timeline |
| 故障恢复 | Task retry + backfill | Asset retry + partition backfill |
| 学习曲线 | 🟡 1-2 周 | 🟡 1-2 周 |
| 生态 | 🟢 巨大(provider 50+) | 🟡 增长中 |
| 年代 | 2014(11 年) | 2018(7 年) |
Airflow 核心优势:
- 47K stars,工作流编排事实标准
- 几乎所有云厂商都原生支持(AWS MWAA / GCP Cloud Composer / Astronomer)
- Provider 生态丰富(50+ 官方,800+ 社区)
- 缺点:DAG-centric 表达力弱,Task 失败 = 整个 DAG 不清晰;UI 老旧
Dagster 核心优势:
- Asset-centric 范式 ⭐ —— 2026 年新方向
- 把数据当 资产 (Asset) 而不是 任务(Task), 自动血缘 + 自动测试
- Dagster Cloud 托管版体验好
- 缺点: 生态比 Airflow 小,Stars 只有 Airflow 1/3
核心结论 : 新项目首选 Dagster(Asset 范式是未来),老项目坚守 Airflow(生态成熟)。
L3 · 仓内转换层 (Transform)
| 维度 | dbt-core | sqlmesh |
|---|---|---|
| Stars | 13,694 | 3,255 |
| 主语言 | Rust ⚡(2025 重构) | Python |
| 范式 | SQL + Jinja | SQL + Python |
| 核心特性 | ref() / source() / 测试 / 文档 | 虚拟环境 + 时间旅行 ⭐ |
| Materialization | view/table/incremental/ephemeral | 同 dbt + snapshot 增强 |
| 测试 | schema_test / data_test | 同 dbt + 单元测试 ⭐ |
| 血缘 | manifest.json + docs | 同 dbt + 自动血缘 ⭐ |
| 增量 | {{this}} + merge |
自动增量检测 ⭐ |
| 回滚 | 手动 dbt run --select -state |
sqlmesh rollback 一键 ⭐ |
| 审计 | run_results.json | 同 dbt + 环境快照 |
| 公司 | dbt Labs | Tobiko Data(2026 改名 SqlMesh) |
| License | Apache-2.0 ✅ | Apache-2.0 ✅ |
dbt-core 核心优势:
- 13.7K stars,ELT 转换事实标准
- 2025 重写为 Rust(dbt-core v1.6+),单模型跑得飞快
dbt run --select state:modified+只跑 modified models- 社区庞大(Slack 80K+ / dbt packages 1000+)
- 缺点: 无内置虚拟环境, 改 SQL 容易影响生产
sqlmesh 核心优势:
- 虚拟环境 (Virtual Environments) ⭐ —— dev / staging / prod 互不干扰
- 时间旅行 (Time Travel) —— 看任意时间点的 data snapshot
- 自动增量 —— 不写
{{this}}也行 - 一键回滚 ——
sqlmesh rollback恢复任意版本 - 缺点 :3K stars, 生态小; 新出 1-2 年, 生产案例少
核心结论 : 大团队首选 dbt-core(生态成熟 + Rust 性能),小团队 / 需要环境隔离的用 sqlmesh。
三、6 维能力对比表(5 件套综合)
| 维度 | Airflow | Airbyte | Dagster | dbt-core | sqlmesh |
|---|---|---|---|---|---|
| 层 | L2 编排 | L1 入仓 | L2 编排 | L3 转换 | L3 转换 |
| Stars | 46,609 ⭐ | 21,957 | 16,065 | 13,694 | 3,255 |
| License | Apache-2.0 ✅ | NOASSERT ⚠️ | Apache-2.0 ✅ | Apache-2.0 ✅ | Apache-2.0 ✅ |
| 核心抽象 | DAG | Connector | Asset | Model | Model + Env |
| 主语言 | Python | Python+Java | Python | Rust ⚡ | Python |
| 云原生 | ✅ K8s/Celery | ✅ Helm/Docker | ✅ K8s/Dagster Cloud | ✅ N/A(库) | ✅ N/A(库) |
| AI Agent 友好 | 🟡 DAG 较复杂 | 🟡 Agent SDK | 🟡 Asset 表达力强 | 🟡 SQL 易写 | 🟡 同 dbt |
| 学习曲线 | 🟡 1-2 周 | 🟡 2 小时(UI) | 🟡 1-2 周 | 🟢 1 周(SQL) | 🟡 1-2 周 |
| 生态规模 | 🟢 巨大 | 🟢 大 | 🟡 中 | 🟢 大 | 🟡 小 |
| 生产案例 | 🟢 Uber / Airbnb / NYT | 🟢 数千家 | 🟡 数百家 | 🟢 数千家 | 🟡 早期采用 |
| 运维成本 | 🟡 中(Celery/K8s) | 🔴 重(Docker 平台) | 🟡 中 | 🟢 零(库) | 🟢 零(库) |
四、深度差异点 5 个
差异点 1:DAG vs Asset(编排层核心哲学)
Airflow 的 DAG-centric:
# airflow_dag.py
from airflow import DAG
from airflow.operators.python import PythonOperator
def extract_github():
# 调 Airbyte API trigger sync
requests.post("http://airbyte/api/v1/connections/sync", ...)
def load_snowflake():
# 等 Airbyte 完成, 跑 dbt
subprocess.run(["dbt", "run"])
with DAG("github_etl", schedule="@daily") as dag:
t1 = PythonOperator(task_id="extract", python_callable=extract_github)
t2 = PythonOperator(task_id="load", python_callable=load_snowflake)
t1 >> t2 # 显式依赖
Dagster 的 Asset-centric:
# dagster_assets.py
from dagster import asset, AssetExecutionContext
@asset
def github_issues_raw():
""" 原始数据 - 入仓层产出 """
return extract_from_airbyte()
@asset(deps=[github_issues_raw])
def github_issues_clean():
""" 清洗后 - 转换层产出 """
return dbt_run(model="stg_issues")
@asset(deps=[github_issues_clean])
def github_issues_summary():
""" 汇总 - 消费层 """
return dbt_run(model="mart_issues_summary")
核心差异:
- Airflow 关心 “ 什么时候跑什么 task” —— 显式依赖 DAG
- Dagster 关心 “ 产生什么数据资产 ” —— 隐式依赖 Asset
Dagster 优势: 改 SQL 不会让 DAG 错乱;Asset 自动血缘; 失败只影响下游 Asset 不影响整条 DAG。
差异点 2:dbt-core Rust 重写的影响
| 维度 | dbt-core v0.x (Python) | dbt-core v1.6+ (Rust ⚡) |
|---|---|---|
| 性能 | 几百模型 5-10 分钟 | 几百模型 30 秒 – 1 分钟 |
| 内存 | 1-2 GB | 200-500 MB |
| 安装 | pip install dbt-core |
同(pip 装 binary) |
| 插件 | dbt adapters Python 实现 | dbt adapters adopt 适配 |
Rust 重写的关键价值: 大项目 model 数 1000+ 时,Python 版跑不动,Rust 版 30 秒出结果。
差异点 3:sqlmesh 虚拟环境 vs dbt profiles
dbt 痛点:
# profiles.yml
my_project: # production
target: prod
outputs:
prod: {type: snowflake, ...}
dev: {type: duckdb, ...}
开发切 dev, 生产切 prod,手动。
sqlmesh 解决:
sqlmesh plan dev # 应用到 dev 环境
sqlmesh plan prod # 应用到 prod 环境
sqlmesh rollback # 一键回滚
sqlmesh 虚拟环境自动管理 —— 同 SQL 自动适配 dev/prod schema, 改 dev 不影响 prod。
差异点 4:Airbyte License 商用风险
| 项目 | License | 商用风险 |
|---|---|---|
| Airflow | Apache-2.0 ✅ | 零风险 |
| Airbyte | NOASSERTION ⚠️ | 自托管需逐 connector 审查(部分 ELv2) |
| Dagster | Apache-2.0 ✅ | 零风险 |
| dbt-core | Apache-2.0 ✅ | 零风险 |
| sqlmesh | Apache-2.0 ✅ | 零风险 |
Airbyte 是 5 件套中唯一 License 风险项。4/5 Apache-2.0 干净。
差异点 5:Airflow 体积 700MB vs Dagster 1.4GB vs Airbyte 907MB
| 项目 | 体积 | 依赖 |
|---|---|---|
| Airflow | 700 MB | Python + Celery/Redis/Postgres |
| Airbyte | 907 MB | Python + Java + Postgres + S3 + Temporal |
| Dagster | 1.4 GB 🟡 | Python + gRPC + K8s 调度器 |
| dbt-core | 100 MB 🟢 | Rust binary(单文件) |
| sqlmesh | 88 MB 🟢 | Python + SQLAlchemy |
核心结论 : 库型工具(dbt / sqlmesh) 最轻量 , 平台型(Airbyte) 中等, 调度型 (Airflow / Dagster) 最重。
五、35 分钟 5 件套集成实战
下面演示完整 5 件套 ELT pipeline:GitHub API → Airbyte → Snowflake → Dagster 调度 → dbt-core 转换 → BI 消费。
Step 1: 启 Airbyte(10 分钟)
git clone https://github.com/airbytehq/airbyte.git
cd airbyte
docker compose up -d
# http://localhost:8000
Step 2: 配 Source + Destination(10 分钟)
UI 创建:
–
Source:GitHub(填 repo + access token)
–
Destination:Snowflake(填 account + database + credentials)
–
Connection:GitHub → Snowflake,every 6h
Step 3: 启 Dagster(5 分钟)
pip install dagster dagster-webserver dagster-snowflake
mkdir dagster_project && cd dagster_project
写 assets.py:
from dagster import asset, AssetExecutionContext
import requests
@asset(group_name="ingestion")
def github_issues_raw():
""" 原始数据从 Airbyte 同步过来 """
# 触发 Airbyte sync
r = requests.post(
"http://localhost:8000/api/v1/connections/sync",
headers={"Authorization": f"Bearer {os.environ['AIRBYTE_TOKEN']}"},
json={"connectionId": "your-connection-id"}
)
r.raise_for_status()
return {"job_id": r.json()["job"]["id"]}
写 definitions.py:
from dagster import Definitions, AssetExecutionContext, MaterializeResult
from dagster_snowflake import SnowflakeResource
from .assets import github_issues_raw
snowflake = SnowflakeResource(account=os.environ["SNOWFLAKE_ACCOUNT"],
user=os.environ["SNOWFLAKE_USER"],
password=os.environ["SNOWFLAKE_PASSWORD"],
database="ANALYTICS",
schema="RAW",
)
defs = Definitions(assets=[github_issues_raw, ...], # + dbt models
resources={"snowflake": snowflake},
)
启 Dagster UI:
dagster dev -f definitions.py
# http://localhost:3000
Step 4: 加 dbt-core 转换(8 分钟)
pip install dbt-snowflake
dbt init github_models
cd github_models
写 models/stg_issues.sql:
{{config(materialized='incremental', unique_key='id') }}
with source as (select * from {{ source('github_raw', 'issues') }}
{% if is_incremental() %}
where updated_at > (select max(updated_at) from {{this}})
{% endif %}
),
cleaned as (
select
id, repo, number, title, state,
user_login, created_at, updated_at, comments
from source
where "pull_request" is null -- 排除 PR
)
select * from cleaned
加 Dagster 的 dbt 集成:
from dagster_dbt import DbtCliResource, dbt_assets
@dbt_assets(manifest=dbt_manifest_path)
def dbt_models(context: AssetExecutionContext, dbt: DbtCliResource):
yield from dbt.cli(["build"], context=context).stream()
Step 5: 启 Airflow 或 Dagster 调度(2 分钟)
Dagster 自动按 @asset 依赖调度, 无需写 DAG。
Step 6: 完整 ELT pipeline(35 分钟内可演示)
GitHub API
↓
Airbyte Sync (E+L)
↓
Snowflake RAW schema
↓
Dagster Asset
↓
dbt-core stg_issues (T)
↓
dbt-core mart_issues_summary
↓
BI 消费(Superset / Metabase / Looker Studio)
整套体验:35 分钟跑通 ”GitHub Issues → Airbyte 入仓 → Dagster 调度 → dbt 转换 → BI 消费 ” 完整数据栈。
六、5 大决策矩阵(按场景选型)
决策 1:L1 入仓层
| 场景 | 推荐 | 理由 |
|---|---|---|
| 企业大数据 / 600+ connector / 自托管 | Airbyte | 覆盖度碾压 |
| Python 工程师 / 5-50 API / GB-MB | dlt | 库范式,Apache-2.0 |
| DataOps + GitOps + Singer | Meltano | YAML + Singer + dbt 内置 |
决策 2:L2 编排层
| 场景 | 推荐 | 理由 |
|---|---|---|
| 新项目 / Asset 范式 / 中小团队 | Dagster | 自动血缘 + 内置测试 + 现代 UX |
| 老项目 / 47K 生态 / 云厂商支持 | Airflow | 事实标准 + MWAA/Composer |
| 生产 Critical / 不能错过任务 | 两者二选一 | 都成熟 |
决策 3:L3 转换层
| 场景 | 推荐 | 理由 |
|---|---|---|
| 大项目 / 1000+ models / 性能优先 | dbt-core | Rust 重写 + 生态成熟 |
| 环境隔离 / 时间旅行 / 审计严格 | sqlmesh | 虚拟环境 + 一键回滚 |
| 新项目 / 需要快速迭代 | dbt-core | 文档 + 社区最大 |
决策 4: 全栈组合(最常见的 4 种)
| 组合 | 适合 |
|---|---|
| Airbyte + Dagster + dbt-core | 🟢 新项目首选(现代化 + 性能) |
| Airbyte + Airflow + dbt-core | 🟢 企业级(稳定 + 生态) |
| dlt + Dagster + dbt-core | 🟡 Python-first 团队 |
| Meltano + Airflow + sqlmesh | 🟡 DataOps + 环境隔离 |
决策 5:5 件套是否都用?
不推荐全用。典型过度工程:
- L1 入仓: 用 1 个(Airbyte / dlt / Meltano 三选一)
- L2 编排: 用 1 个 (Airflow / Dagster 二选一, 别两个一起用)
- L3 转换: 用 1 个(dbt / sqlmesh 二选一)
3 件套 = 最优(每层 1 个)。再加监控(OpenMetadata / DataHub)+ 编排可视化(Dagster UI / Airflow UI)+ 测试套件, 就是完整数据栈。
七、风险清单
⚠️ 风险 1:Airbyte License 商用审查
- 5 件套中唯一 NOASSERTION
- 部分 connector (ELv2) 商业受限
- 建议: 用前读
LICENSE+ 看 connectormetadata.yaml
⚠️ 风险 2:Dagster 1.4GB 体积 + 较陡学习曲线
- Asset-centric 范式需要重新思考 ” 数据 = 资产 ”
- 团队需要 1-2 周适应
- 建议: 小项目先 Airflow, 大项目再考虑 Dagster
⚠️ 风险 3:dbt-core Rust 重写的兼容性
- 部分老旧 adapter 还在用 Python 实现
- v1.6+ API 有 breaking changes
- 建议: 新项目用最新 LTS 版本
⚠️ 风险 4:sqlmesh 生产案例少
- 3K stars,2026 才独立出 SqlMesh 公司
- 生产环境最佳实践还在积累
- 建议: 小项目试水, 大项目 dbt-core 兜底
⚠️ 风险 5:Airflow DAG 表达力局限
- DAG-centric,Task 失败 = 整 DAG 失败状态混乱
- 动态 DAG 生成复杂
- 建议: 复杂数据流考虑 Dagster Asset
⚠️ 风险 6:5 件套运维叠加成本
- Airbyte 平台 + Airflow/Dagster 调度 + dbt-core 转换 = 3 个独立系统
- 监控 / 权限 / 备份 / 升级 都要管
- 建议: 中小规模用托管(Airbyte Cloud + Dagster Cloud), 大项目再自托管
八、总结
3 个 ” 最值得装 ” 的理由
理由 1: 数据集成不是 1 个工具, 是 3 层分工
强行 1 个工具做 3 件事, 要么臃肿要么弱。L1 入仓 + L2 编排 + L3 转换 各司其职, 自由组合,2026 年最佳实践。
理由 2:4/5 Apache-2.0 干净
5 件套中只有 Airbyte NOASSERTION 有风险, 其他 4 个 Apache-2.0 商用零风险。国内合规项目首选 Apache-2.0 组合。
理由 3: 新范式已经在路上
- L2:Dagster Asset 替代 Airflow DAG
- L3:dbt-core Rust 重写 + sqlmesh 虚拟环境
- 2026 是 新工具取代老工具 的关键节点
一句 ” 先试一周 ”
新项目首选组合 Airbyte + Dagster + dbt-core,3 件套覆盖 L1+L2+L3,4/5 Apache-2.0 干净,Rust + Asset + 现代化 UX。老项目坚守 Airflow + dbt 不动。
参考
- Airbyte 调研 · https://east196.cn/?p=326 (L1 入仓龙头)
- Apache Airflow 调研 · https://east196.cn/?p=306 (L2 编排老炮)
- Dagster 调研 · https://east196.cn/?p=390 (L2 编排新范式)
- dbt-core 调研 · https://east196.cn/?p=290 (L3 转换事实标准)
- sqlmesh 调研 · https://east196.cn/?p=292 (L3 转换 dbt 替代)
- ETL 工具横评 · https://east196.cn/?p=411 (L1 3 大流派对决)
- dlt 调研 · https://east196.cn/?p=407 (L1 Python 库派)
- Meltano 调研 · https://east196.cn/?p=409 (L1 协议派)
- DuckDB 调研 · https://east196.cn/?p=294 (本地 destination 跨层)
- Airflow 官方 · https://airflow.apache.org
- Dagster 官方 · https://dagster.io
- dbt Labs · https://www.getdbt.com
- SqlMesh 官方 · https://sqlmesh.com
作者 :yunying(增长运营官)
调研日期 :2026-08-26
方法 : 实时 GitHub API 5 仓库 + 5 篇单点(306/326/390/290/292) 整合 + 35 分钟 Airbyte + Dagster + dbt 集成验证
📎 WordPress 链接
- 官方链接:《数据集成全景 2026:Airbyte / Airflow / Dagster / dbt-core / sqlmesh 5 件套横评 + 3 大层职责分明,Airflow 47K stars 凭什么是调度之王》
- 短链:
https://east196.cn/?p=412 - WordPress API ID:412
- 状态:published · 2026-08-26