Задание потока данных всегда создает новый сегмент по умолчанию, даже если установлены tempLocation и gcpTempLocation? - PullRequest
1 голос
/ 05 февраля 2020

Похоже, что мое задание Dataflow всегда создает новый сегмент хранилища Google Cloud Storage по умолчанию, даже если определены stagingLocation, tempLocation и 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);
  }

Однако этот код должен выполняться только в событии что tempLocation не определено в PipelineOptions, и я установил tempLocation как с помощью аргумента командной строки, так и с помощью метода setTempLocation. Я определил интерфейс параметров, расширив GcpOptions и добавив несколько дополнительных методов получения и установки параметров.

Если я не определяю получатель и установщик tempLocation в интерфейсе параметров, создается впечатление, что tempLocation автоматически по умолчанию будет использовать временную папку только что созданной корзины по умолчанию (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);
}

Кто-нибудь может объяснить, почему всегда создается контейнер по умолчанию и как мне этого избежать?

Edit:

Выглядит так, как будто я развертываю задание Dataflow непосредственно из командной строки с теми же аргументами, а не генерирую шаблон Dataflow, а затем развертываю задание через интерфейс консоли, который кажется tempLocation быть установлен правильно, и никакое дополнительное ведро не создано. Похоже, это решает проблему, с которой я столкнулся, но я не совсем уверен, почему это решение работает.

1 Ответ

0 голосов
/ 06 февраля 2020

Я предполагаю, что это поведение для определенных PipelineOptions хорошо объяснено в документации GCP :

gcpTempLocation - путь к облачному хранилищу для потока данных для размещения любых временных файлов. Вы должны создать этот сегмент заранее, до запуска конвейера. Если вы не укажете gcpTempLocation, вы можете указать опцию конвейера tempLocation, и тогда для gcpTempLocation будет установлено значение tempLocation. Если ничего не указано, будет создано значение по умолчанию gcpTempLocation.

Пока что это жестко закодированный случай для управляемых служб потока данных GCP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...