Я пишу приложение, которое пытается запустить пакетный поток данных на основе параметров. Для этого я использую 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), которая имеет все необходимые классы. И понятно, что рассматриваемый путь неверен.
Каковы возможные обходные пути, которые я могу использовать для запуска программ обработки данных.
Логика обнаружения и выгрузки класса маршрута ограничена файлами и не поддерживает сценарии, в которых банки встроены в другие банки. Некоторые способы решения этой проблемы:
Существует также очень связанный вопрос SO, где пользователь использует свою IDE для генерации uberjar для выполнения и использовал аналогичный сценарий для вашего запроса.
Если вы используете gradle, который я использую, вы можете закрасить банку с помощью этого плагина:
id "com.github.johnrengelman.shadow" версия "5.0.0"