Cloud Composer集成DBT报错:找不到dbt_packages/dbt_utils的dbt_project.yml
问题背景
运行包含DbtRunOperator和DbtTestOperator的Airflow DAG时失败,报错提示找不到指定路径下的dbt依赖配置文件,尽管已在packages.yml中声明了依赖:
packages: - package: calogica/dbt_expectations version: [">=0.5.0", "<0.6.0"] - package: dbt-labs/dbt_utils version: 0.7.1
Airflow日志关键报错信息:
[2024-03-11, 11:28:17 UTC] {dbt_hook.py:130} INFO - Runtime Error [2024-03-11, 11:28:17 UTC] {dbt_hook.py:130} INFO - Failed to read package: Runtime Error [2024-03-11, 11:28:17 UTC] {dbt_hook.py:130} INFO - no dbt_project.yml found at expected path /home/airflow/gcs/dags/dbt_models/dbt_packages/dbt_utils/dbt_project.yml
核心原因
dbt依赖包未被拉取到指定路径——Airflow执行Dbt任务前,没有运行dbt deps命令安装packages.yml中声明的依赖,导致dbt_packages文件夹缺失或依赖文件不完整。
解决操作方案
方案1:在DAG中添加dbt deps前置任务
在DbtRunOperator和DbtTestOperator之前新增任务,先执行dbt deps拉取依赖,确保后续Dbt任务能找到完整的包文件。可以通过BashOperator或Python任务实现:
用BashOperator示例:
from airflow.operators.bash import BashOperator dbt_deps_task = BashOperator( task_id='dbt_deps', bash_command='cd /home/airflow/gcs/dags/dbt_models && dbt deps', dag=dag ) # 配置任务依赖顺序 dbt_deps_task >> dbt_run_task >> dbt_test_task
用PythonOperator示例:
from airflow.operators.python import PythonOperator import subprocess def pull_dbt_deps(): subprocess.run( ['dbt', 'deps'], cwd='/home/airflow/gcs/dags/dbt_models', check=True ) dbt_deps_task = PythonOperator( task_id='dbt_deps', python_callable=pull_dbt_deps, dag=dag ) dbt_deps_task >> dbt_run_task >> dbt_test_task
方案2:提前预安装依赖到代码库
在本地开发环境中,进入dbt项目根目录(即包含dbt_project.yml和packages.yml的dbt_models文件夹),执行:
dbt deps
执行完成后会生成dbt_packages文件夹,将该文件夹与dbt_models下的其他配置文件一起上传到GCS存储桶的/dags/dbt_models/路径下,确保Airflow能读取到完整的依赖包。
方案3:检查DbtOperator的路径配置
确认DbtRunOperator和DbtTestOperator的dir参数是否正确指向dbt项目根目录(包含dbt_project.yml的文件夹):
from airflow.providers.dbt.cloud.operators.dbt import DbtRunOperator dbt_run_task = DbtRunOperator( task_id='dbt_run', dir='/home/airflow/gcs/dags/dbt_models', # 确保路径准确 dbt_bin='/usr/local/bin/dbt', # 可选,若dbt不在系统默认PATH中需指定 dag=dag )
验证步骤
执行上述方案后,检查Airflow运行环境中的/home/airflow/gcs/dags/dbt_models/dbt_packages目录,确认dbt_utils和dbt_expectations文件夹存在,且每个文件夹内都包含dbt_project.yml文件。
内容的提问来源于stack exchange,提问作者Antoine F

