有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java数据流作业总是创建新的默认存储桶,即使设置了tempLocation和gcpTempLocation?

我的数据流工作似乎总是创建一个新的默认Google云存储桶,即使定义了stagingLocation、tempLocation和gcpTempLocation。在浏览了ApacheBeam(2.6.0)库代码之后,这些行出现在了GcpOptions中。java似乎是罪魁祸首:

String tempLocation = options.getTempLocation();
  if (isNullOrEmpty(tempLocation)) {
    tempLocation =
        tryCreateDefaultBucket(
            options,
            newCloudResourceManagerClient(options.as(CloudResourceManagerOptions.class))
                .build());
    options.setTempLocation(tempLocation);
  }

然而,只有在PipelineOptions中没有定义tempLocation的情况下,才应该执行这段代码,我已经使用命令行参数和setTempLocation方法设置了tempLocation。我通过扩展GcpOptions并添加一些额外的选项获取器和设置器来定义选项接口

如果我没有在选项界面中定义tempLocation getter和setter,它看起来好像tempLocation将自动默认为新创建的默认bucket的临时文件夹(gs://dataflow-staging-us-central1-job_number/temp),但我已经定义了tempLocation命令行参数

以下是数据流作业的主要方法:

public static void main(String[] args) {
    Options options = PipelineOptionsFactory.fromArgs(args).as(Options.class);
    GoogleCredentials credentials = null;
    try {
        credentials = GoogleCredentials.fromStream(new FileInputStream("./src/main/resources/credentials.json"))
                .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    options.setGcpCredential(credentials);
    options.setTempLocation("gs://example_bucket/temp");
    options.setGcpTempLocation("gs://example_bucket/temp");
    run(options);
}

有人能解释为什么总是创建默认bucket,以及我如何避免这种情况吗

编辑:

看起来,如果我使用相同的参数直接从命令行部署数据流作业,而不是生成数据流模板,然后通过控制台界面部署作业,那么模板位置似乎设置正确,并且没有创建额外的bucket。这似乎解决了我面临的问题,但我不完全确定为什么这个解决方案有效


共 (0) 个答案