복붙노트

[HADOOP] Hadoop / Spark에서 proto3를 사용하려면 어떻게해야합니까?

HADOOP

Hadoop / Spark에서 proto3를 사용하려면 어떻게해야합니까?

구문 = "proto3";에 의존하는 여러 .proto 파일이 있습니다. 또한 Hadoop / Spark 작업을 빌드하는 데 사용되는 Maven 프로젝트 (Hadoop 2.7.1 및 Spark 1.5.2)가 있습니다. Hadoop / Spark에서 데이터를 생성하고 내 proto3 파일에 따라 직렬화하고 싶습니다.

libprotoc 3.0.0을 사용하여 pom.xml에 다음을 가지고있는 한, 내 Maven 프로젝트 내에서 잘 작동하는 Java 소스를 생성합니다.

<dependency>
  <groupId>com.google.protobuf</groupId>
  <artifactId>protobuf-java</artifactId>
  <version>3.0.0-beta-1</version>
</dependency>  

이제 클러스터에 배포 된 작업에서 libprotoc에서 생성 한 클래스를 사용하면 다음과 같은 결과가 발생합니다.

java.lang.VerifyError : class blah overrides final method mergeUnknownFields.(Lcom/google/protobuf/UnknownFieldSet;)Lcom/google/protobuf/GeneratedMessage$Builder;
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)

Hadoop / Spark가 3.0.0-beta-1과 호환되지 않는 protobuf-java 2.5.0에 종속되어 있기 때문에 ClassLoader가 실패한 것으로 보입니다. 나는 또한 protobufs (아마도 <3)가 다른 몇 곳에서 나의 항아리에 들어간 길을 발견했다.

$ 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?)?

비슷한 문제 : Spark java.lang.VerifyError

해결법

  1. ==============================

    1.이 일이 여기에 나와 있습니다. https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

    이 일이 여기에 나와 있습니다. https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

    protobuffers를 재배치하면 VerifyError가 사라집니다.

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

    2.Dranxo와 같은 솔루션이지만 sbt 어셈블리가 있습니다.

    Dranxo와 같은 솔루션이지만 sbt 어셈블리가 있습니다.

    assemblyShadeRules in assembly := Seq(
      ShadeRule.rename("com.google.protobuf.*" -> "shadedproto.@1").inProject
        .inLibrary("com.google.protobuf" % "protobuf-java" % protobufVersion)
    )
    
  3. from https://stackoverflow.com/questions/34487996/how-can-i-use-proto3-with-hadoop-spark by cc-by-sa and MIT license