如何在Dataproc';使用Java SDK的GceClusterConfig
当尝试使用Dataproc创建新的计算集群时,它抱怨说,当我指定一个“真实”区域(如“us-west1-a”或“us-central1-f”)时,我收到一条错误消息,表示该端点不支持指定的区域。(请参阅下面的错误文本) 正如您所看到的,根据错误,它期望该区域是“全局的”。但是,将其指定为全局会生成错误,即“全局”不是有效区域。做一些愚蠢的事情,比如将其指定为“[global]”,只会生成无效的URI格式。未指定区域会导致它抱怨必须设置区域 因此,所有逻辑上可能的值都被消除,这表明必须采取其他步骤来解决此问题 错误:如何在Dataproc';使用Java SDK的GceClusterConfig,java,google-cloud-dataproc,Java,Google Cloud Dataproc,当尝试使用Dataproc创建新的计算集群时,它抱怨说,当我指定一个“真实”区域(如“us-west1-a”或“us-central1-f”)时,我收到一条错误消息,表示该端点不支持指定的区域。(请参阅下面的错误文本) 正如您所看到的,根据错误,它期望该区域是“全局的”。但是,将其指定为全局会生成错误,即“全局”不是有效区域。做一些愚蠢的事情,比如将其指定为“[global]”,只会生成无效的URI格式。未指定区域会导致它抱怨必须设置区域 因此,所有逻辑上可能的值都被消除,这表明必须采取其他步骤
Reason: 400 Bad Request
{
"errors" : [
{
"reason" : "badRequest",
"domain" : "global",
"message" : "Region us-central1-f invalid or not supported by this endpoint; permitted regions: [global]"
}
],
"status" : "INVALID_ARGUMENT",
"code" : 400,
"message" : "Region us-central1-f invalid or not supported by this endpoint; permitted regions: [global]"
}
生成以下内容的代码段:
Cluster cluster = createClusterSpec();
createOp = dataproc.projects().regions().clusters()
.create(projectId, region, cluster);
createOp.setBearerToken(credentials.getAccessToken().getTokenValue());
createOp.execute();
// I'm cheating here: the actual code pulls the config from various
// inputs and properties, but we can replicate with hard-coded values.
private Cluster createClusterSpec() {
GceClusterConfig computeEngineConfig = new GceClusterConfig();
// ZONE_URI_FORMAT =
// "https://www.googleapis.com/compute/v1/projects/%s/zones/%s"
computeEngineConfig.setZoneUri(
String.format(ZONE_URI_FORMAT, "funny-project-001",
"us-central1-f"));
InstanceGroupConfig masterConfig = new InstanceGroupConfig();
masterConfig.setMachineTypeUri(
String.format(MACHINE_TYPE_URI_FORMAT,
"funny-project-001", "us-central1-f",
"n1-standard-1"))
.setNumInstances(1);
InstanceGroupConfig workerConfig = new InstanceGroupConfig();
workerConfig.setMachineTypeUri(
String.format(MACHINE_TYPE_URI_FORMAT,
"funny-project-001", "us-central1-f",
"n1-standard-1"))
.setNumInstances(1);
ClusterConfig googClusterConfig = new ClusterConfig();
googClusterConfig.setGceClusterConfig(computeEngineConfig);
googClusterConfig.setMasterConfig(masterConfig);
googClusterConfig.setWorkerConfig(workerConfig);
Cluster returnVal = new Cluster();
returnVal.setProjectId("funny-project-001");
returnVal.setConfig(googClusterConfig);
returnVal.setClusterName("mrfoo");
return returnVal;
}
Dataproc区域是独立于计算引擎“区域”指定的,即使两者之间确实存在关系。目前,您实际上只与“全球”Dataproc区域进行对话,该区域知道如何为所有GCE区域提供服务。因此,您只需将“global”指定为以下参数:
createOp = dataproc.projects().regions().clusters()
.create(projectId, "global", cluster);
然后将您的GCE区域指定为特定的us-central1-f
或任何您想要的区域。如果您使用Dataproc的UI选择创建集群的选项,然后在最底层有一个“等效REST”链接,那么您可以在console.cloud.google.com中使用底层JSON REST表示
您将看到如下内容:
POST /v1/projects/foo-project/regions/global/clusters/
{
...
"gceClusterConfig": {
"zoneUri": "https://www.googleapis.com/compute/v1/projects/foo-project/zones/us-west1-a"
...
}
...
}
POST URI中的
regions/global
是SDK的create(project,region,cluster)
方法中region参数所在的位置,而gceClusterConfig
的主体是显式设置zoneUri
的位置。Dataproc区域是独立于计算引擎“区域”指定的尽管两者之间确实存在某种关系。目前,您实际上只与“全球”Dataproc区域进行对话,该区域知道如何为所有GCE区域提供服务。因此,您只需将“global”指定为以下参数:
createOp = dataproc.projects().regions().clusters()
.create(projectId, "global", cluster);
然后将您的GCE区域指定为特定的us-central1-f
或任何您想要的区域。如果您使用Dataproc的UI选择创建集群的选项,然后在最底层有一个“等效REST”链接,那么您可以在console.cloud.google.com中使用底层JSON REST表示
您将看到如下内容:
POST /v1/projects/foo-project/regions/global/clusters/
{
...
"gceClusterConfig": {
"zoneUri": "https://www.googleapis.com/compute/v1/projects/foo-project/zones/us-west1-a"
...
}
...
}
POST URI中的regions/global
是SDK的create(project,region,cluster)
方法中region参数所在的位置,而gceClusterConfig
的主体是显式设置zoneUri
的位置