尝试使用DataflowRunner时出现ClassNotFound异常

10

我正在尝试使用Apache Beam 0.6.0在GCP上启动Dataflow作业。由于无法使用"mvn:execjava"启动作业,因此我正在使用shade插件编译uber jar。我包含了以下依赖项:

<dependency>
  <groupId>org.apache.beam</groupId>
  <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
  <version>0.6.0-SNAPSHOT</version>
</dependency>

我遇到了以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: Unknown 'runner' specified 'DataflowRunner', supported pipeline runners [DirectRunner]
    at org.apache.beam.sdk.options.PipelineOptionsFactory.parseObjects(PipelineOptionsFactory.java:1609)
    at org.apache.beam.sdk.options.PipelineOptionsFactory.access$400(PipelineOptionsFactory.java:104)
    at org.apache.beam.sdk.options.PipelineOptionsFactory$Builder.as(PipelineOptionsFactory.java:289)
    at com.disney.dtss.desa.tools.SpannerSinkTest.main(SpannerSinkTest.java:116)
Caused by: java.lang.ClassNotFoundException: DataflowRunner
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.apache.beam.sdk.options.PipelineOptionsFactory.parseObjects(PipelineOptionsFactory.java:1595)

我还有什么遗漏吗?

如果未注册DataflowRunner,那肯定是期望的输出。您能否分享有关pom.xml、mvn调用或者超级jar内容清单以及如何调用它的更多信息? - Kenn Knowles
我遇到了同样的问题。当我通过mvn compile exec:java启动管道时,它可以正常工作,但是当我构建jar包时它失败了。超级jar包包含了必要的类。 - Paweł Szczur
2个回答

10

尝试以下命令:

mvn compile exec:java -Dexec.mainClass=你的主类名 -Pdataflow-runner

在最后添加 -Pdataflow-runner


2
pom.xml 中,如果依赖项被定义为配置文件的一部分,请确保为 mvn 命令指定配置文件。Apache Beam 的默认 WordCount 示例对于 DataflowRunner 就是这样做的。如果您不关心配置文件,则只需将依赖项定义移动到 pom 文件的 <dependencies> 部分即可。 - Andrew Nguonly

3

根据@Andrew Nguonly的评论,我将DataflowRunner的依赖项复制到外部范围(即在pom.xml文件中的<dependencies>标签下)。

基本上添加了这个:

<dependency>
  <groupId>org.apache.beam</groupId>
  <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
  <version>${beam.version}</version>
  <scope>runtime</scope>
</dependency>

在beam wordCount示例中的pom.xml文件中,位于</dependencies>闭合标签之前。

1
对于VSCode用户来说,上述方法可能是最佳选择,因为目前还没有干净的切换配置文件的方法:https://github.com/microsoft/vscode-maven/issues/465 - nomadic_squirrel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接