Dataproc 中 DuckDB 如何使用服务账号连接 BigQuery?
结论
可以先在启动 DuckDB 的进程环境中设置 GOOGLE_CLOUD_PROJECT,再执行原有的 DuckDB SQL。Dataproc 集群节点可以通过 metadata service 获取关联服务账号的短期凭据。对于这里涉及的 BigQuery 扩展认证路径,如果扩展没有识别到 GCP 环境所需的项目环境变量,可能就不会尝试 metadata-based auth,并报出 No authentication credentials found。扩展维护者建议设置 GOOGLE_CLOUD_PROJECT。相关问题的维护者答复
配置步骤
在运行 DuckDB 的 Dataproc 作业或服务中设置项目 ID:
export GOOGLE_CLOUD_PROJECT=<your-gcp-project-id>
duckdb
将占位符替换为实际的 Google Cloud 项目 ID,并确保 DuckDB 进程能读取该变量。如果作业调度器负责启动 DuckDB,应在作业的进程环境中设置变量;只在另一个交互式 shell 中设置并不够。
然后在 DuckDB 中执行连接语句:
INSTALL bigquery FROM community;
LOAD bigquery;
ATTACH 'project=X' AS bq (TYPE bigquery, READ_ONLY);
SELECT * FROM bq.MY_DATASET.MY_TABLE;
将 X 替换为目标 BigQuery 项目。DuckDB BigQuery 扩展文档也要求先配置受支持的认证方式,再附加项目。BigQuery 扩展文档
为什么 impersonation 命令没有解决问题
gcloud config set auth/impersonate_service_account SA 配置的是 gcloud CLI 的行为,gcloud auth print-access-token 则会打印访问令牌。单独运行这两条命令,不会自动把令牌交给 DuckDB 的 BigQuery 扩展。题目中提到的 DuckDB secret 方式需要显式提供令牌,但受公司政策限制。这里应由扩展从 Dataproc 节点环境中识别并使用关联服务账号的凭据。
检查权限
设置环境变量后,如果错误变成权限拒绝,凭据可能已经获取成功,但服务账号仍需对目标数据集和查询操作拥有适当的 BigQuery IAM 权限。所需权限取决于读取的资源和使用的 API。请检查 Dataproc 节点实际关联的服务账号是否已获授权。Dataproc 节点使用的服务账号及其资源访问权限需要单独配置。Google Cloud:BigQuery 认证
备注:内容仅供参考。
