我有一个带语法的原型文件 proto2
另外,我需要使用spark(2.0.2)和hbase。我的项目是用gradle构建的。
现在,当我运行java代码时,出现以下错误:
Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 3.0 failed 1 times, most recent failure: Lost task 0.0 in stage 3.0 (TID 3, localhost): java.lang.NoSuchMethodError: com.google.protobuf.Descriptors$Descriptor.getOneofs()Ljava/util/List;
at com.google.protobuf.GeneratedMessageV3$FieldAccessorTable.<init>(GeneratedMessageV3.java:1707)
at com.google.protobuf.AnyProto.<clinit>(AnyProto.java:52)
at com.google.protobuf.Any.getDescriptor(Any.java:129)
at com.google.protobuf.util.JsonFormat$ParserImpl.buildWellKnownTypeParsers(JsonFormat.java:1100)
at com.google.protobuf.util.JsonFormat$ParserImpl.<clinit>(JsonFormat.java:1094)
at com.google.protobuf.util.JsonFormat$Parser.merge(JsonFormat.java:277)
这个stacktrace与这里发布的问题非常相似,但是那里发布的解决方案不适用于我。
我尝试的是:
我变了 compile group: 'com.google.protobuf', name: 'protobuf-java', version: '2.5.0'
至 compile group: 'org.spark-project.protobuf', name: 'protobuf-java', version: '2.4.1-shaded'
正如这个链接所暗示的,但同样的错误仍然存在。
非常感谢您的帮助!
1条答案
按热度按时间prdp8dxp1#
好的,解决办法是:
relocate
是救援的方法。在我的主程序中,我有一个build.gradle如下:
然后,我创建了另一个gradle包,其中包含以下build.gradle
根本原因是hbase引用了proto2,而我的程序使用的是proto3,因此导致了这种情况
NoSuchMethodError
错误。解决方法是使用relocate
,以重新定位com.google.protobuf
另一个gradle项目的唯一目的是构建具有proto2的hbase jar文件。希望它能帮助其他程序员^