【问题标题】:Dataflow fails with java.lang.NoSuchMethodError: io.grpc.protobuf.ProtoUtils.marshaller(Lcom/google/protobuf/Message;)数据流因 java.lang.NoSuchMethodError 失败:io.grpc.protobuf.ProtoUtils.marshaller(Lcom/google/protobuf/Message;)
【发布时间】:2016-12-02 16:23:24
【问题描述】:

我正在尝试让 Dataflow 作业在 Google Cloud 上运行。它总是失败:

java.lang.NoSuchMethodError: io.grpc.protobuf.ProtoUtils.marshaller(Lcom/google/protobuf/Message;)Lio/grpc/MethodDescriptor$Marshaller

这是一个 maven 项目,这是我的依赖项:

<dependencies>
  <dependency>
    <groupId>com.google.cloud.dataflow</groupId>
    <artifactId>google-cloud-dataflow-java-sdk-all</artifactId>
    <version>1.8.0</version>
  </dependency>   
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-pubsub</artifactId>
    <version>0.4.0</version>
  </dependency>    
  <dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.0.0</version>
  </dependency>       
</dependencies>

我尝试了很多不同的依赖版本。我错过了什么?

无论我是通过 exec:java 还是通过 shade jar 运行,结果都是一样的。

完整的堆栈跟踪:

(e8dbd0c1b8b8a22): java.lang.NoSuchMethodError: io.grpc.protobuf.ProtoUtils.marshaller(Lcom/google/protobuf/Message;)Lio/grpc/MethodDescriptor$Marshaller; 在 com.google.iam.v1.IAMPolicyGrpc.(IAMPolicyGrpc.java:56) 在 com.google.cloud.pubsub.spi.v1.PublisherSettings$Builder.(PublisherSettings.java:487) 在 com.google.cloud.pubsub.spi.v1.PublisherSettings$Builder.createDefault(PublisherSettings.java:508) 在 com.google.cloud.pubsub.spi.v1.PublisherSettings$Builder.access$000(PublisherSettings.java:402) 在 com.google.cloud.pubsub.spi.v1.PublisherSettings.defaultBuilder(PublisherSettings.java:224) 在 com.google.cloud.pubsub.spi.DefaultPubSubRpc.(DefaultPubSubRpc.java:138) 在 com.google.cloud.pubsub.PubSubOptions$DefaultPubSubRpcFactory.create(PubSubOptions.java:60) 在 com.google.cloud.pubsub.PubSubOptions$DefaultPubSubRpcFactory.create(PubSubOptions.java:54) 在 com.google.cloud.ServiceOptions.rpc(ServiceOptions.java:399) 在 com.google.cloud.pubsub.PubSubImpl.(PubSubImpl.java:115) 在 com.google.cloud.pubsub.PubSubOptions$DefaultPubSubFactory.create(PubSubOptions.java:43) 在 com.google.cloud.pubsub.PubSubOptions$DefaultPubSubFactory.create(PubSubOptions.java:38) 在 com.google.cloud.ServiceOptions.service(ServiceOptions.java:391) 在 com.google.lindsaysmith.titan.DataflowBulkLoadNodes$SendPubSub.sendPubsubMessage(DataflowBulkLoadNodes.java:41) 在 com.google.lindsaysmith.titan.DataflowBulkLoadNodes$SendPubSub.processElement(DataflowBulkLoadNodes.java:32) 在 com.google.cloud.dataflow.sdk.util.SimpleDoFnRunner.invokeProcessElement(SimpleDoFnRunner.java:49) 在 com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.processElement(DoFnRunnerBase.java:139) 在 com.google.cloud.dataflow.sdk.runners.worker.SimpleParDoFn.processElement(SimpleParDoFn.java:190) 在 com.google.cloud.dataflow.sdk.runners.worker.ForwardingParDoFn.processElement(ForwardingParDoFn.java:42) 在 com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerLoggingParDoFn.processElement(DataflowWorkerLoggingParDoFn.java:47) 在 com.google.cloud.dataflow.sdk.util.common.worker.ParDoOperation.process(ParDoOperation.java:55) 在

【问题讨论】:

标签: google-cloud-dataflow


【解决方案1】:

在这种情况下,通常的答案是您确实必须完全使用在 Dataflow SDK 的依赖项中声明的 gRPC 和协议缓冲区的版本。这包括所有传递依赖,因此您可能必须抑制其他库的 gRPC 或 protobuf 依赖,以免它们相互干扰。

您可以查看版本here (gRPC)here (protobuf)。我将它们排除在此答案之外,因此它不会过时。

【讨论】:

  • 感谢您的提示,事实证明这里的问题实际上是 pubsub 库 - 它引用了比其他两个库更新的 grpc 版本。回到 0.3.0 修复了 NoSuchMethodException。
  • 很好的一点 - 我已经稍微更新了我的答案,提到这不仅仅是“你”使用这个库,而是整个依赖树中的任何东西都可以。
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2023-03-24
  • 1970-01-01
  • 2017-01-21
相关资源
最近更新 更多