You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BigQuery Spark连接器从Dataproc(Datalab)连接私有BigQuery表时令牌获取失败

解决Dataproc访问BigQuery私有数据集的令牌错误

你遇到的这个Error getting access token from metadata server问题,本质是你的Dataproc集群使用的服务账号没有访问BigQuery私有数据集的权限——毕竟公开数据集是开放访问的,不需要额外授权,但私有表必须明确给服务账号开权限才行。

先拆解下你看到的核心错误:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD. : java.io.IOException: Error getting access token from metadata server at

这个错误说明Spark通过BigQuery连接器请求访问私有表时,尝试从GCP元数据服务器获取服务账号的访问令牌,但要么令牌获取失败(比如元数据访问被阻断),要么拿到的令牌没有对应权限,导致访问被拒。

下面是一步步的解决办法:

1. 确认Dataproc集群使用的服务账号

首先得搞清楚你的集群用的是哪个服务账号:

  • 打开GCP控制台,进入Dataproc集群详情页,在「配置」板块里找「服务账号」字段;
  • 或者用gcloud命令查询:
    gcloud dataproc clusters describe <你的集群名称> --region <集群所在区域>
    
    输出里找config.gceServiceAccount字段,就是集群使用的服务账号邮箱(格式类似xxxx-compute@developer.gserviceaccount.com)。

2. 给服务账号添加BigQuery访问权限

根据你的需求给这个服务账号授权:

  • 如果只是需要读取表,添加BigQuery Data Viewer角色;
  • 如果需要读写操作,添加BigQuery Editor角色;

操作方式二选一:

控制台操作

  1. 打开BigQuery控制台,找到你的私有数据集my-test-dataset;
  2. 点击数据集右侧的「共享」按钮,进入权限设置;
  3. 点击「添加成员」,输入刚才查到的服务账号邮箱;
  4. 在「角色」下拉框里选择BigQuery > BigQuery Data Viewer(或对应角色),保存即可。

gcloud命令操作

gcloud projects add-iam-policy-binding <你的GCP项目ID> \
  --member serviceAccount:<服务账号邮箱> \
  --role roles/bigquery.dataViewer

3. 验证权限是否生效

回到Datalab里,先试试用简单的BigQuery魔法命令测试访问:

%%bigquery
SELECT * FROM my-test-dataset.test-table LIMIT 10

如果能正常返回数据,说明权限已经生效,再运行你原来的Spark代码应该就没问题了。

4. 额外排查(如果权限加了还是报错)

  • 检查元数据服务器访问:确保你的Dataproc集群没有被自定义防火墙规则阻断对GCP元数据服务器的访问(默认Dataproc集群是允许的,如果你改了防火墙,要确保允许169.254.169.254的HTTP访问);
  • 确认连接器版本:Dataproc预装的BigQuery连接器是和Spark版本兼容的,不要手动替换成旧版本,否则可能出现认证问题。

内容的提问来源于stack exchange,提问作者mLC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:50:55