提问者:小点点

数据流作业始终创建新的默认存储桶,即使设置了临时位置和 gcpTempLocation ?


我的数据流作业似乎总是创建一个新的默认 Google Cloud Storage 存储桶,即使定义了暂存位置、临时位置和 gcpTempLocation。在查看了Apache Beam(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并添加一些额外的选项getter和setter来定义Options接口。

如果我没有在Options界面中定义temlocegetter和setter,那么看起来就好像temloce将自动默认为新创建的默认存储桶的temp文件夹(gs://dataflow-staging-us-Cental1-job_number/temp),但我已经定义了temloce命令行参数。

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

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);
}

谁能解释为什么总是创建默认存储桶以及如何避免这种情况?

编辑:

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


共2个答案

匿名用户

我想特定管线选项的这种行为在GCP文件中有很好的解释:

gcpTempLocal-Dataflow的云存储路径,用于暂存任何临时文件。在运行管道之前,您必须提前创建此存储桶。如果您没有指定gcpTempLocal,您可以指定管道选项temLocal,然后gcpTempLocal将被设置为temLocal的值。如果两者都没有指定,将创建默认的gcpTempLocal

到目前为止,这似乎是GCP数据流管理服务的硬编码案例。

匿名用户

正在创建的存储桶用于暂存位置,它应该默认为临时位置,但它已损坏(从 SDK v2.43.0 开始)。您可以指定暂存位置以避免创建额外的存储桶。

https://stackoverflow.com/a/75403319/1031796