Airflow执行BigQuery FOR循环脚本指定EU区域仍在美国运行报错
问题原因与解决方案
问题背景
在Airflow 1.10.15(GCP Cloud Composer 1)中执行每周任务,通过FOR循环从region-eu.INFORMATION_SCHEMATA获取EU多区域的BigQuery数据集列表,设置DEFAULT_TABLE_EXPIRATION_DAYS=7时,出现错误:
Not found: Table <project_id>:region-eu.INFORMATION_SCHEMATA was not found in location US at [3:19]
即使已指定region-eu且任务设置了location='eu',仍报错,但单独执行查询、另一个同类循环脚本可正常运行。
可能原因
- BigQueryHook未明确传递区域参数:Airflow的BigQueryHook默认区域为US,若仅在任务级别设置
location='eu',但初始化Hook时未传入该参数,查询或后续操作会使用默认的US区域,导致跨区域访问EU的INFORMATION_SCHEMATA失败。 - 数据集更新环节未指定区域:循环中更新数据集属性时,未明确指定EU区域,BigQuery客户端 fallback到默认US区域,触发跨区域查询错误(INFORMATION_SCHEMATA为区域级视图,无法跨区域访问)。
- Airflow GCP连接配置冲突:GCP连接的默认区域被设为US,覆盖了任务级别的
location参数,导致所有BigQuery操作默认使用US区域。
解决方法
- 初始化BigQueryHook时强制指定区域:
确保Hook初始化时传入location='eu',而非仅依赖任务级别设置:from airflow.contrib.hooks.bigquery_hook import BigQueryHook # 明确指定location参数 bq_hook = BigQueryHook(bigquery_conn_id='your_gcp_connection_id', location='eu') - 查询SQL中完整指定项目+区域:
避免默认项目或区域歧义,SQL中明确写出项目ID和区域:SELECT schema_name FROM `<your-project-id>.region-eu.INFORMATION_SCHEMATA.SCHEMATA` - 更新数据集时指定区域:
调用BigQuery客户端更新数据集属性时,明确传入location='eu':client = bq_hook.get_client() dataset_ref = client.dataset(dataset_name, project='your-project-id') dataset = client.get_dataset(dataset_ref, location='eu') dataset.default_table_expiration_ms = 7 * 24 * 60 * 60 * 1000 # 更新时指定区域 client.update_dataset(dataset, ['default_table_expiration_ms'], location='eu') - 检查Airflow GCP连接配置:
进入Airflow UI的「Admin > Connections」,找到对应的GCP连接,确认「Extra」字段中未设置location: US这类覆盖性配置,若有则删除或改为location: eu。 - 对比正常脚本找差异:
将当前报错脚本与能正常运行的同类脚本逐行对比,重点检查Hook初始化、查询执行、数据集更新步骤中是否存在参数传递差异,比如是否漏传location。
内容的提问来源于stack exchange,提问作者Samuel Kožuch
相关产品推荐
相关产品推荐

