Похоже, что мое задание 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 быть установлен правильно, и никакое дополнительное ведро не создано. Похоже, это решает проблему, с которой я столкнулся, но я не совсем уверен, почему это решение работает.