使用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角色;
操作方式二选一:
控制台操作
- 打开BigQuery控制台,找到你的私有数据集
my-test-dataset; - 点击数据集右侧的「共享」按钮,进入权限设置;
- 点击「添加成员」,输入刚才查到的服务账号邮箱;
- 在「角色」下拉框里选择
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
相关产品推荐
相关产品推荐

