Maven 如何将proto3与Hadoop/Spark结合使用?

Maven 如何将proto3与Hadoop/Spark结合使用?,maven,hadoop,apache-spark,protocol-buffers,Maven,Hadoop,Apache Spark,Protocol Buffers,我有几个.proto文件依赖于syntax=“proto3”。我还有一个Maven项目,用于构建Hadoop/Spark作业(Hadoop 2.7.1和Spark 1.5.2)。我想在Hadoop/Spark中生成数据,然后根据proto3文件对其进行序列化 使用libprotoc 3.0.0,我生成的Java源代码在我的Maven项目中运行良好,只要我的pom.xml中有以下内容: <dependency> <groupId>com.google.protobuf&

我有几个.proto文件依赖于
syntax=“proto3”。我还有一个Maven项目,用于构建Hadoop/Spark作业(Hadoop 2.7.1和Spark 1.5.2)。我想在Hadoop/Spark中生成数据,然后根据proto3文件对其进行序列化

使用libprotoc 3.0.0,我生成的Java源代码在我的Maven项目中运行良好,只要我的pom.xml中有以下内容:

<dependency>
  <groupId>com.google.protobuf</groupId>
  <artifactId>protobuf-java</artifactId>
  <version>3.0.0-beta-1</version>
</dependency>  
考虑到Hadoop/Spark依赖protobuf java 2.5.0,而protobuf java 2.5.0与我的3.0.0-beta-1不兼容,类加载器失败似乎是合理的。我还注意到protobufs(大概版本<3)已经在我的jar中的其他几个地方找到了它们的方法:

$ jar tf target/myjar-0.1-SNAPSHOT.jar | grep protobuf | grep '/$'
org/apache/hadoop/ipc/protobuf/
org/jboss/netty/handler/codec/protobuf/
META-INF/maven/com.google.protobuf/
META-INF/maven/com.google.protobuf/protobuf-java/
org/apache/mesos/protobuf/
io/netty/handler/codec/protobuf/
com/google/protobuf/
google/protobuf/
我能做些什么(Maven Shade?)来解决这个问题吗


这里也有类似的问题:

这里记录了这类事情:

只需重新定位protobuffers,VerifyError就会消失:

          <relocations>
            <relocation>
              <pattern>com.google.protobuf</pattern>
              <shadedPattern>shaded.com.google.protobuf</shadedPattern>
            </relocation>
          </relocations>

com.google.protobuf
shaded.com.google.protobuf

与德兰索相同的解决方案,但带有sbt组件

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("com.google.protobuf.*" -> "shadedproto.@1").inProject
    .inLibrary("com.google.protobuf" % "protobuf-java" % protobufVersion)
)

您是如何执行您的程序的?@kaushal spark submitTry使用此选项
——packages com.google.protobuf:protobuf java:3.0.0-beta-1
以前从未听说过此选项,它会做什么?我尝试了一下,但还是得到了
java.lang.VerifyError
assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("com.google.protobuf.*" -> "shadedproto.@1").inProject
    .inLibrary("com.google.protobuf" % "protobuf-java" % protobufVersion)
)