我在使用Java协议缓冲类作为Spark作业中RDDs的对象模型时遇到了一个错误。
对于我的应用程序,我的.proto文件具有重复字符串的属性。例如:
message OntologyHumanName
{
repeated string family = 1;
}
因此,2.5.0版本的protoc编译器会生成类似以下的Java代码:
private com.google.protobuf.LazyStringList family_ = com.google.protobuf.LazyStringArrayList.EMPTY;
如果我运行一个使用Kryo序列化器的Scala Spark作业,我会遇到以下错误
Caused by: java.lang.NullPointerException
at com.google.protobuf.UnmodifiableLazyStringList.size(UnmodifiableLazyStringList.java:61)
at java.util.AbstractList.add(AbstractList.java:108)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:134)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:40)
at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:708)
at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)
... 40 more
使用spark.serializer=org.apache.spark.serializer.JavaSerializer时,相同的代码可以正常工作。
我的环境是CDH QuickStart 5.5和JDK 1.8.0_60。