2015-12-28 15 views
5

Ho diversi file .proto che si basano su syntax = "proto3";. Ho anche un progetto Maven che viene utilizzato per creare lavori Hadoop/Spark (Hadoop 2.7.1 e Spark 1.5.2). Mi piacerebbe generare dati in Hadoop/Spark e quindi serializzarli in base ai miei file proto3.Come posso usare proto3 con Hadoop/Spark?

Utilizzando libprotoc 3.0.0, ho generare sorgenti di Java che funzionano bene all'interno del mio progetto Maven finché ho il seguente nel mio pom.xml:

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

Ora, quando muovo il libprotoc generati classi in un lavoro che viene distribuito a un gruppo che vengono colpiti con:

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 difetto sembra ragionevole dato che Hadoop/Spark hanno una dipendenza da protobuf-java 2.5.0 che è incompatibile con la mia 3.0.0- beta-1. Ho anche notato che protobufs (presumibilmente versioni < 3) hanno trovato la loro strada nel mio vaso in pochi altri posti:

$ 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'è qualcosa che posso fare (Maven ombra?) Per risolvere la questione?

problema simile qui: Spark java.lang.VerifyError

+0

Come stai eseguendo il tuo programma? – Kaushal

+0

@kaushal spark-submit – dranxo

+0

Prova con questa opzione '--packages com.google.protobuf: protobuf-java: 3.0.0-beta-1' – Kaushal

risposta

3

Stessa soluzione come Dranxo di ma con assemblaggio sbt

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.protobuf.*" -> "[email protected]").inProject 
    .inLibrary("com.google.protobuf" % "protobuf-java" % protobufVersion) 
)