我使用编译器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版。
问题是 环境中导致此问题的问题是什么?
答案 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 生成的代码时收到的消息。