升级composer-2.1.0-airflow-2.3.4后GCSToBigQueryOperator无法读取GCS数据
问题诊断与修复方案
核心问题定位
从错误日志来看,存在两个关键异常:
- API返回
Unknown output format: media::读取Schema文件时的API调用参数异常 - GCS对象未找到:
No such object: [BUCKET_HIDDEN]/data/creditsafe/CD01/txt/*.txt:通配符路径匹配失败,或Schema文件路径错误
结合环境升级背景,主要排查以下几个方向:
1. 修正Schema文件路径(最可能的根源)
代码中schema_object参数使用的是本地DAG目录路径f"dags/schema/creditsafe/{data_type}.json",但GCSToBigQueryOperator要求schema_object必须是GCS存储桶中的对象路径,而非Composer本地DAG目录路径。旧版本Airflow可能兼容本地读取,但升级后依赖的google-cloud-bigquery库严格要求从GCS加载Schema文件。
修复步骤:
- 将Schema文件上传到目标GCS存储桶(可复用任务使用的
os.environ["GCS_BUCKET"]) - 修改
schema_object参数为GCS内的路径:# 示例:Schema文件上传到GCS的schema/creditsafe/目录下 schema_object = f"schema/creditsafe/{data_type}.json" # 若Schema在其他桶,需写完整GS路径: # schema_object = f"gs://your-schema-bucket/schema/creditsafe/{data_type}.json"
2. 检查source_objects通配符的正确性
错误日志显示系统尝试直接获取*.txt字面对象,而非解析通配符,可能是以下原因:
file_names变量格式错误,未正确传递通配符路径- 升级后
google-cloud-storage库对通配符的解析逻辑变化
验证与修复:
- 确认
file_names的值是类似data/creditsafe/CD01/txt/*.txt的字符串(或包含正确通配符的列表) - 若使用列表传递多路径,确保每个条目格式正确,例如:
# 单个通配符路径 file_names = "data/creditsafe/CD01/txt/*.txt" # 或多个具体文件路径 file_names = ["data/creditsafe/CD01/txt/file1.txt", "data/creditsafe/CD01/txt/file2.txt"] - 若通配符仍失效,尝试用
prefix参数替代,指定文件前缀:gcs_to_bq = GCSToBigQueryOperator( # ...其他参数 prefix="data/creditsafe/CD01/txt/", # 移除source_objects参数 # ...其他参数 )
3. 确认依赖库版本兼容性
Composer 2.1.0搭配的apache-airflow-providers-google版本若过低,可能与Airflow 2.3.4存在兼容性问题。
验证步骤:
- 在Composer环境的PyPI依赖中,确认
apache-airflow-providers-google版本≥8.0.0(适配Airflow 2.3.x的推荐版本) - 若版本不足,通过命令更新依赖:
gcloud composer environments update YOUR_ENV_NAME \ --location YOUR_LOCATION \ --update-pypi-packages apache-airflow-providers-google==8.10.0
4. 权限与路径快速验证
- 确认
google_cloud_default连接拥有GCS存储桶的storage.objects.get权限 - 用
gsutil验证通配符路径是否能匹配到文件:
若命令返回空,说明路径或文件确实不存在;若返回文件列表,则排除路径问题。gsutil ls gs://[BUCKET_HIDDEN]/data/creditsafe/CD01/txt/*.txt
内容的提问来源于stack exchange,提问作者David Kane
相关产品推荐
相关产品推荐

