2015-12-28 18 views
5

Tôi có một số tệp .proto dựa trên syntax = "proto3";. Tôi cũng có một dự án Maven được sử dụng để xây dựng các công việc Hadoop/Spark (Hadoop 2.7.1 và Spark 1.5.2). Tôi muốn tạo dữ liệu trong Hadoop/Spark và sau đó tuần tự hóa nó theo các tệp proto3 của tôi.Tôi có thể sử dụng proto3 bằng Hadoop/Spark như thế nào?

Sử dụng libprotoc 3.0.0, tôi tạo ra nguồn Java mà hoạt động tốt trong phạm vi dự án Maven tôi chừng nào tôi còn có sau đây trong pom.xml của tôi:

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

Bây giờ, khi tôi sử dụng libprotoc tạo của tôi lớp học trong một công việc đó được triển khai tới một cụm tôi nhận được nhấn với:

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) 

ClassLoader thất bại có vẻ hợp lý cho rằng Hadoop/Spark có một sự phụ thuộc vào protobuf-java 2.5.0 mà không tương thích với 3.0.0- của tôi beta-1. Tôi cũng nhận thấy rằng protobufs (có lẽ là phiên bản < 3) đã tìm thấy đường vào lọ của tôi ở một vài nơi khác:

$ 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/ 

Có điều gì tôi có thể làm (Maven Shade?) Để sắp xếp này ra?

vấn đề tương tự ở đây: Spark java.lang.VerifyError

+0

Bạn đang thực hiện chương trình như thế nào? – Kaushal

+0

@kaushal spark-submit – dranxo

+0

Hãy thử với tùy chọn này '--packages com.google.protobuf: protobuf-java: 3.0.0-beta-1' – Kaushal

Trả lời

3

giải pháp Tương tự như Dranxo của nhưng với lắp ráp sbt

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.protobuf.*" -> "[email protected]").inProject 
    .inLibrary("com.google.protobuf" % "protobuf-java" % protobufVersion) 
) 
Các vấn đề liên quan