【问题标题】:Failed to construct instance from factory method DataflowRunner#fromOptions in beamSql, apache beam无法从 beamSql 中的工厂方法 DataflowRunner#fromOptions 构造实例,apache beam
【发布时间】:2018-03-12 02:25:28
【问题描述】:

我在下面的 beamSql 程序中指定了数据流运行器:

DataflowPipelineOptions options = PipelineOptionsFactory.as(DataflowPipelineOptions.class);
    options.setStagingLocation("gs://gcpbucket/staging");
    options.setTempLocation("gs://gcpbucket/tmp");
    options.setProject("beta-19xxxx");
    options.setRunner(DataflowRunner.class);
    Pipeline p = Pipeline.create(options);

但我遇到了异常:

Exception in thread "main" java.lang.RuntimeException: Failed to construct instance from factory method DataflowRunner#fromOptions(interface org.apache.beam.sdk.options.PipelineOptions)
at org.apache.beam.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:233)
at org.apache.beam.sdk.util.InstanceBuilder.build(InstanceBuilder.java:162)
at org.apache.beam.sdk.PipelineRunner.fromOptions(PipelineRunner.java:55)
at org.apache.beam.sdk.Pipeline.create(Pipeline.java:150)
at my.proj.StarterPipeline.main(StarterPipeline.java:34)Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.beam.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:222)
... 4 more Caused by: java.lang.IllegalArgumentException: Unable to use ClassLoader to detect classpath elements. Current ClassLoader is jdk.internal.loader.ClassLoaders$AppClassLoader@782830e, only URLClassLoaders are supported.
at org.apache.beam.runners.dataflow.repackaged.org.apache.beam.runners.core.construction.PipelineResources.detectClassPathResourcesToStage(PipelineResources.java:43)
at org.apache.beam.runners.dataflow.DataflowRunner.fromOptions(DataflowRunner.java:262)

谁能帮我弄清楚到底是什么问题?

【问题讨论】:

  • 您使用的是 Java 9 吗? Apache Beam 目前不支持 Java 9。看看这个 Stack Overflow 帖子:stackoverflow.com/questions/48292491/…。这是同一个问题。建议现在降级到 Java 8。
  • 嗯,是的! Java 9 是问题所在,我将它降级到 Java 8 并且它工作正常。谢谢安德鲁
  • 我遇到了类似的问题,但我使用的是 java 8。谁能告诉我这个问题的原因。

标签: google-cloud-dataflow apache-beam


【解决方案1】:

将 java 9 降级到 java 8 成功了。

【讨论】:

    【解决方案2】:

    当使用 JVM > 8 的 Beam SDK 时可能会出现此问题。

    对 JVM 11(或 9)的支持只是实验性的,从 Beam SDK 2.12 开始,至少到 Beam SDK 2.16。这个答案提供了更多的上下文:https://stackoverflow.com/a/57710742/1046584

    关于这个特定的堆栈跟踪,它似乎与这个问题有关:https://issues.apache.org/jira/browse/BEAM-3718

    【讨论】:

      【解决方案3】:

      对我来说,解决方法是不同的。在我的 pom.xml 中,以下依赖项设置为 2.20,而 apache beam 设置为 2.19

      <dependency>
        <groupId>org.apache.beam</groupId>
        <artifactId>beam-sdks-java-extensions-google-cloud-platform-core</artifactId>
        <version>2.20</version>
      </dependency>
      

      将其更改为与梁版本相同后,构建工作正常。

      Net Net,只要确保所有与 beam 相关的 sdk 都设置为相同的版本。使用相同的变量,例如 ${beamVersion},这样您就不会遇到奇怪的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-21
        • 2022-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多