数据库
用 Astronomer Cosmos 运行 dbt…
当需要在 Airflow 中通过 Astronomer Cosmos 以本地执行方式运行 dbt Fusion 项目时,按顺序完成版本、二进制、解析、连接与执行配置。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Astronomer Cosmos 特定
解决思路
- 确认 dbt 引擎是 Fusion 而非 Core(Core 应改用 cosmos-dbt-core),并确认仓库为 Snowflake、Databricks、BigQuery 或 Redshift 之一。
- 确认 Cosmos 版本 ≥ 1.11.0:运行 `pip show astronomer-cosmos` 检查,必要时执行 `pip install "astronomer-cosmos>=1.11.0"` 升级。
- 安装 dbt Fusion 二进制(Cosmos 与 dbt Core 均不自带):在 Airflow 运行时/镜像中安装,例如 Dockerfile 中 `USER root`、`RUN apt-get update && apt-get install -y curl`、`ENV SHELL=/bin/bash`、`RUN curl -fsSL https://public.cdn.getdbt.com/fs/install/install.sh | sh -s -- --update`、`USER astro`;常见路径为 Astro Runtime 的 `/home/astro/.local/bin/dbt` 或系统级 `/usr/local/bin/dbt`,并用 `dbt --version` 验证。
- 选择解析策略(RenderConfig,与 dbt Core 相同,三选一):`dbt_manifest`(大型项目、解析最快,需 `ProjectConfig.manifest_path`)、`dbt_ls`(复杂 selector、需 dbt 原生选择,要求调度器可访问 Fusion 二进制)、`automatic`(简单场景,让 Cosmos 自行选择);通过 `RenderConfig(load_method=LoadMode.AUTOMATIC/DBT_MANIFEST/DBT_LS)` 配置。
- 配置仓库连接(ProfileConfig):设置 `profile_name`、`target_name`,并使用对应的 profile_mapping(如 `SnowflakeUserPasswordProfileMapping(conn_id="snowflake_default")`)。
- 配置 ExecutionConfig:必须使用 `ExecutionMode.LOCAL`(默认,不要更改),设置 `invocation_mode=InvocationMode.SUBPROCESS`,并将 `dbt_executable_path` 指向 Fusion 二进制路径(如 `/home/astro/.local/bin/dbt`)。
- 配置 ProjectConfig:设置 `dbt_project_path`;使用 dbt_manifest 加载模式时设置 `manifest_path`;若依赖已在 CI 预计算可设 `install_dbt_deps=False`。
- 组装 DAG/TaskGroup:方案 A 使用 `DbtDag` 独立 DAG,传入 project_config、profile_config、execution_config、render_config、start_date、schedule;方案 B 在已有 DAG 中用 `DbtTaskGroup`(Airflow 3.x 用 `from airflow.sdk import dag, task`,Airflow 2.x 用 `from airflow.decorators import dag, task`),并用 `chain(pre_dbt(), dbt, post_dbt())` 串联前后任务。
- 最终校验:Cosmos ≥1.11.0、Fusion 二进制路径存在且可执行、仓库属于受支持列表、密钥通过 Airflow 连接或环境变量管理而非明文。
- 若启用 Fusion 后出现 dbt Core 回归问题,设置环境变量 `AIRFLOW__COSMOS__PRE_DBT_FUSION=1`。
- 提醒用户自行测试:DAG 能在 Airflow UI 中解析(无导入/解析错误),且至少一个模型能对目标仓库手动运行成功。
- 注意 Fusion 特有约束:不支持 `AIRFLOW_ASYNC` 异步模式;不支持 virtualenv(Fusion 是二进制而非 Python 包);仓库支持处于预览阶段。
适用边界 · 注意事项
- dbt 引擎是 dbt Core 而非 Fusion 时(应改用 cosmos-dbt-core 技能)。
- 仓库不在 Snowflake、Databricks、BigQuery、Redshift 支持列表内时。
- 需要异步执行(AIRFLOW_ASYNC)或 virtualenv 隔离时(Fusion 不支持)。