2016-10-18 3 views
1

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

Но когда я создаю объект объекта трубопровода с помощью 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

Чтобы подтвердить, что вы не устанавливаете какие-либо связанные трубопроводы в банку? –

+0

Я использовал плагин градиента springboot и, кажется, застегнул все банки внутри uberjar. Замена этого с помощью плагина приложения (и, следовательно, не создание uberjar, похоже, решает проблему). –

ответ

2

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

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

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

+1

Я в конечном итоге просто использовал плагин приложения, а не использовал плагин Spring Gradle (вариант № 2). Это означает, что банки не сжаты в банке. Кажется, это исправить проблему. Спасибо за разъяснения. –

Смежные вопросы