java - 如何使用 Java SDK 在 Dataproc 的 GceClusterConfig 中指定 ZoneUri

标签 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 区域是独立于 Compute Engine“区域”指定的,尽管两者之间确实存在关系。目前,您确实只与“全局”Dataproc 区域对话,该区域知道如何为所有 GCE 区域提供服务。因此,您只需指定“global”作为参数即可:

createOp = dataproc.projects().regions().clusters()
       .create(projectId, "global", cluster);

然后将您的 GCE 区域指定为特定的 us-central1-f 或您想要的任何内容。如果您使用 Dataproc 的 UI 选择创建集群的选项,则可以在 console.cloud.google.com 中使用底层 JSON REST 表示形式,然后在最底部有一个“等效 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) 方法中区域参数所在的位置,而 的正文>gceClusterConfig 是您显式设置 zoneUri 的位置。

关于java - 如何使用 Java SDK 在 Dataproc 的 GceClusterConfig 中指定 ZoneUri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41052004/

相关文章:

java - 在java中匹配字符串中的感叹号

python - 将 Pandas DataFrame 上传到 Dataproc 的 GCP 存储桶

scala - Spark : Why execution is carried by a master node but not worker nodes?

pyspark - 无法使用 Spark-avro 读取 DataProc Spark 中的 avro

java - 我刚刚安装了 android SDK 更新,现在我的项目充满了错误

java - 当我从扩展特定接口(interface)的类创建对象时,我可以在使用该接口(interface)的地方使用该对象吗?

java - 单击时更改按钮背景

java - 将所有标准输入读入 Java 字节数组

java - 将Java hadoop作业迁移到dataproc的最佳方法是什么

python - 使用 SparkNLP 时,无法在 Dataproc 集群中读取本地数据