Запуск заданий потока данных из Java-приложения

2

Я пишу приложение, которое пытается запустить пакетный поток данных на основе параметров. Для этого я использую PipelineOptionsFactory.create().as(...) а затем сеттеры для настройки параметров.

Но когда я создаю объект объекта Pipeline.create(opts) используя Pipeline.create(opts) я получаю следующую ошибку:

04:48:08.711 [pool-4-thread-9] ERROR c.g.c.d.s.r.DataflowPipelineRunner - Unable to convert url (jar:file:/ferric.jar!/) to file.
04:48:08.711 [pool-4-thread-9] WARN  BatchJobManager - unable to start materialization for view
java.lang.RuntimeException: Failed to construct instance from factory method DataflowPipelineRunner#fromOptions(interface com.google.cloud.dataflow.sdk.options.PipelineOptions)
    at com.google.cloud.dataflow.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:234)
    at com.google.cloud.dataflow.sdk.util.InstanceBuilder.build(InstanceBuilder.java:163)
    at com.google.cloud.dataflow.sdk.runners.PipelineRunner.fromOptions(PipelineRunner.java:58)
    at com.google.cloud.dataflow.sdk.Pipeline.create(Pipeline.java:135)
    at com.brightcove.rna.dataflow.MaterializationPipeline.<init>(MaterializationPipeline.java:45)
    at com.brightcove.rna.dataflow.MaterializationPipeline.create(MaterializationPipeline.java:92)
    at com.brightcove.rna.ferric.DataflowJobService.createPipeline(DataflowJobService.java:121)
    at javaslang.control.Try.mapTry(Try.java:410)
    at javaslang.control.Try.map(Try.java:380)
    at com.brightcove.rna.ferric.DataflowJobService.create(DataflowJobService.java:102)
    at com.brightcove.rna.ferric.BatchJobScheduler.lambda$null$13(BatchJobScheduler.java:94)
    at javaslang.Value.forEach(Value.java:246)
    at com.brightcove.rna.ferric.BatchJobScheduler.lambda$startMaterializationJobs$14(BatchJobScheduler.java:91)
    at javaslang.control.Try.onSuccess(Try.java:442)
    at com.brightcove.rna.ferric.BatchJobScheduler.startMaterializationJobs(BatchJobScheduler.java:90)
    at com.brightcove.rna.ferric.BatchJobScheduler.run(BatchJobScheduler.java:52)
    at sun.reflect.GeneratedMethodAccessor94.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.google.cloud.dataflow.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:223)
    ... 27 common frames omitted
Caused by: java.lang.IllegalArgumentException: Unable to convert url (jar:file:/ferric.jar!/) to file.
    at com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.detectClassPathResourcesToStage(DataflowPipelineRunner.java:3176)
    at com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.fromOptions(DataflowPipelineRunner.java:291)
    ... 32 common frames omitted
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(File.java:418)
    at com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.detectClassPathResourcesToStage(DataflowPipelineRunner.java:3172)
    ... 33 common frames omitted

Похоже, что бегун конвейера пытается определить путь к банке, который содержит классы, которые необходимо загрузить. Существует только одна банка (uberjar), которая имеет все необходимые классы. И понятно, что рассматриваемый путь неверен.

Каковы возможные обходные пути, которые я могу использовать для запуска программ обработки данных.

  • 0
    Для подтверждения, вы не устанавливаете какие-либо связанные PipelineOptions для jar?
  • 0
    Я использовал плагин gradle для Springboot, и он, похоже, застегнул все банки внутри uberjar. Замена этого на плагин приложения (и, следовательно, не создание uberjar, похоже, решает проблему).
Теги:
google-cloud-platform
google-cloud-dataflow

2 ответа

2
Лучший ответ

Логика обнаружения и выгрузки класса маршрута ограничена файлами и не поддерживает сценарии, в которых банки встроены в другие банки. Некоторые способы решения этой проблемы:

  1. Сгладьте банку с несколькими банками в одну банку, содержащую все извлеченные банки. Это хорошо, так как вы сохраняете свое свойство jar и не нуждаетесь в написании кода для изменения конвейера, но если вы его построите регулярно, это сделает вашу сборку более сложной. Я бы заглянул в плагин Maven shade и связался с ним, чтобы сделать это для вас или эквивалентной технологии, зависящей от вашей системы сборки.
  2. Используйте более традиционную настройку, где вы указываете каждую отдельную банку отдельно. Вы можете использовать плагин Maven exec, чтобы помочь в создании сценариев для создания и запуска вашего приложения.
  3. Извлеките все банки во время выполнения и установите свойство filesToStage в PipelineOptions со всеми ресурсами, которые вы хотите организовать.
  4. Добавьте поддержку встроенных сценариев jar в Apache Beam/Dataflow. Я зарегистрировал эту проблему отслеживания, если вы хотите взглянуть на выполнение этого вклада.

Существует также очень связанный вопрос SO, где пользователь использует свою IDE для генерации uberjar для выполнения и использовал аналогичный сценарий для вашего запроса.

  • 1
    В конце концов я просто использовал плагин приложения, а не плагин Gradle с весенней загрузкой (вариант № 2). Это означает, что банки не сжимаются внутри банки. Это, кажется, решить проблему. Спасибо за разъяснения.
0

Если вы используете gradle, который я использую, вы можете закрасить банку с помощью этого плагина:

id "com.github.johnrengelman.shadow" версия "5.0.0"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню