从protobuf版本2.4迁移到2.5的环境问题

时间:2015-07-30 09:08:31

标签: apache-spark protocol-buffers

我使用编译器2.4生成了protobuf代码。我已经创建了我的应用程序jar。这很好,我可以成功运行我的火花工作。 与protobuf相关的spark类路径中的jar是

 mesos-0.18.1-shaded-protobuf.jar,
 protobuf-java-2.5.0-spark.jar

但是当我在我的sbt单元测试中使用相同的生成代码时,它失败了

  [info]   org.apache.spark.SparkException: Job aborted due to stage        
  failure: Task 0 in stage 2.0 failed 1 times, most recent failure: 
  Lost task 0.0 in stage 2.0 (TID 2, localhost):     
  java.lang.UnsupportedOperationException: This is supposed to be overridden by subclasses.                                                         
  [info]  at com.google.protobuf.GeneratedMessage.getUnknownFields(GeneratedMessage.java:180)

从谷歌搜索我发现我需要将protoc编译器更改为2.5版本,现在我的单元测试工作正常。 但我的应用程序无法在spark中运行。我得到的例外是

  java.lang.VerifyError: class xxx.xxx.xx.. 
  overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;

我的应用程序运行的机器和我的sbt测试运行是不同的

sbt中的类路径包含

  protobuf-java-2.5.0.jar
  protobuf-java-2.5.0-spark.jar   

我看了一下pom文件mesos-0.18.1-shaded-protobuf.jar它显示它包含google-protobuf 2.5版。

问题是 环境中导致此问题的问题是什么?

1 个答案:

答案 0 :(得分:1)

基本上使用协议缓冲区2.5,有几种方法从协议缓冲区库代码中定义为final,到生成代码中。这意味着使用 protoc 2.4 生成的代码不能与协议缓冲区2.5库一起使用,反之亦然

正确识别

 java.lang.UnsupportedOperationException: This is supposed to be overridden by classes.                                                         
    [info]  at   com.google.protobuf.GeneratedMessage.getUnknownFields(GeneratedMessage.java:180)

是使用协议缓冲区2.5

的库运行 protoc 2.4 生成的代码时获得的消息

消息

java.lang.VerifyError: class xxx.xxx.xx.. 
overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;

是使用协议缓冲区2.4 的库运行 protoc 2.5 生成的代码时收到的消息。

请参阅:error with serialization with protobuf