Java 带火花的proto2无法运行

Java 带火花的proto2无法运行,java,hadoop,apache-spark,gradle,protocol-buffers,Java,Hadoop,Apache Spark,Gradle,Protocol Buffers,我有一个语法为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

我有一个语法为
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)
线程“main”org.apache.spark.sparkeexception中的异常:作业因阶段失败而中止:阶段3.0中的任务0失败1次,最近的失败:阶段3.0中的任务0.0丢失(TID 3,localhost):java.lang.NoSuchMethodError:com.google.protobuf.Descriptors$Descriptor.getOneofs()Ljava/util/List;
位于com.google.protobuf.GeneratedMessageV3$FieldAccessorTable。(GeneratedMessageV3.java:1707)
在com.google.protobuf.AnyProto(AnyProto.java:52)
位于com.google.protobuf.Any.getDescriptor(Any.java:129)
位于com.google.protobuf.util.JsonFormat$ParserImpl.buildWellKnownTypeParsers(JsonFormat.java:1100)
在com.google.protobuf.util.JsonFormat$ParserImpl.(JsonFormat.java:1094)
位于com.google.protobuf.util.JsonFormat$Parser.merge(JsonFormat.java:277)
此stacktrace与发布的问题非常相似,但发布的解决方案不适用于我

我尝试的是:

我变了

编译组:'com.google.protobuf',名称:'protobufjava',版本:'2.5.0'

编译组:'org.spark project.protobuf',名称:'protobuf java',版本:'2.4.1-shade'
如该链接所示,但仍然存在相同的错误


非常感谢您的帮助

好的,下面是解决方案:

重新定位
是救援的方法

在我的主程序中,我有一个build.gradle,如下所示:

dependencies {
    compile project(path: ':utils:hbasewrapper', configuration: 'shadow')
}
apply plugin: 'com.github.johnrengelman.shadow'

shadowJar {
    baseName = 'awesome-jar'
    zip64 true
    // This is to avoid the conflict between proto3 we are using and the proto2 hbase is using.
    relocate ('com.google.protobuf', 'importer.com.google.protobuf')
}
然后,我创建了另一个gradle包,其中包含以下build.gradle

group 'com.abc.hbasewrapper'
version '1.0-SNAPSHOT'

dependencies {
    compile group: 'org.apache.hbase', name: 'hbase-client', version: '1.3.0'
    compile group: 'org.apache.hbase', name: 'hbase-server', version: '1.2.2'
}

apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'

shadowJar {
    baseName = 'hbasewrapper'
    version = null
    zip64 true
    relocate ('com.google.protobuf', 'hbasewrapper.com.google.protobuf')
    relocate ('io.netty', 'hbasewrapper.io.netty')
}
根本原因是HBase引用了proto2,而我的程序使用的是proto3,因此导致此
NoSuchMethodError
错误。 解决方案是使用
重新定位
,将
com.google.protobuf
重新定位到不同的gradle项目,该项目的唯一目的是构建具有proto2的hbase jar文件

希望它能帮助其他程序员^