使用 google-cloud-python API 访问 Dataproc 时出现无效区域错误
Posted
技术标签:
【中文标题】使用 google-cloud-python API 访问 Dataproc 时出现无效区域错误【英文标题】:Invalid region error when using google-cloud-python API to access Dataproc 【发布时间】:2018-11-20 20:44:36 【问题描述】:我正在尝试使用 google-cloud-python 库在 Dataproc 中创建一个集群,但是在设置 region = 'us-central1'
时出现以下异常:
google.api_core.exceptions.InvalidArgument: 400 Region 'us-central1' is invalid.
Please see https://cloud.google.com/dataproc/docs/concepts/regional-endpoints
for additional information on regional endpoints
代码(基于example):
#!/usr/bin/python
from google.cloud import dataproc_v1
client = dataproc_v1.ClusterControllerClient()
project_id = 'my-project'
region = 'us-central1'
cluster = ...
response = client.create_cluster(project_id, region, cluster)
【问题讨论】:
【参考方案1】:Dataproc 使用region
字段来路由 REST 请求,但是,该字段未在 gRPC 客户端中使用(因此出现错误)。
只有global
多区域可以通过默认端点访问。要使用us-central1
等区域端点,您必须将端点配置为在客户端的transport
上寻址。
Dataproc 区域端点遵循以下模式:<region>-dataproc.googleapis.com:443
。 region
字段应设置为与端点中的区域相同的值。
例子:
#!/usr/bin/python
from google.cloud import dataproc_v1
from google.cloud.dataproc_v1.gapic.transports import cluster_controller_grpc_transport
transport = cluster_controller_grpc_transport.ClusterControllerGrpcTransport(
address='us-central1-dataproc.googleapis.com:443')
client = dataproc_v1.ClusterControllerClient(transport)
project_id = 'my-project'
region = 'us-central1'
cluster = ...
response = client.create_cluster(project_id, region, cluster)
【讨论】:
The related issue 是在 google-cloud-python 存储库中提出的,所以也许有一天它们会更容易管理。【参考方案2】:同样使用google-cloud-java客户端:
ClusterControllerSettings settings =
ClusterControllerSettings.newBuilder()
.setEndpoint("us-central1-dataproc.googleapis.com:443")
.build();
try (ClusterControllerClient clusterControllerClient = ClusterControllerClient.create(settings))
String projectId = "my-project";
String region = "us-central1";
Cluster cluster = Cluster.newBuilder().build();
Cluster response =
clusterControllerClient.createClusterAsync(projectId, region, cluster).get();
【讨论】:
【参考方案3】:目前,更改默认 API 端点的推荐方法是to use client_options
:
client_options (Union[dict, google.api_core.client_options.ClientOptions]) – 用于在客户端设置用户选项的客户端选项。 API Endpoint 应通过 client_options 设置。
这是一个从 json 文件加载凭据的示例(带有 f-string 的 Python 3.6+ 语法):
from google.cloud.dataproc_v1 import ClusterControllerClient
client = ClusterControllerClient.from_service_account_file(
service_account_json_path,
client_options='api_endpoint': f'your_region-dataproc.googleapis.com:443')
【讨论】:
以上是关于使用 google-cloud-python API 访问 Dataproc 时出现无效区域错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 BigQuery Storage API(测试版)启动和读取多个流