使用 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:443region 字段应设置为与端点中的区域相同的值。

例子:

#!/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 时出现无效区域错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVRO 格式的 BigQuery 流式插入

使用 BigQuery Storage API(测试版)启动和读取多个流

使用 python 在谷歌云存储桶中创建文件夹

华为AP3010DN-AGN怎么升级到FAT AP

朋友送了一台aruba AP61无线AP,和传统的无线AP不太一样,没有RESET按键,也没有说明书,不知道如何部署?

锐捷ap320-l可以当路由器用么