如何设置KRYO的不可修改的Collection串行火花代码

问题描述:

我在Java中使用的火花(V1.6.1)KRYO序列化和序列化的同时具有收藏在该领域的一类,它引发以下错误 -如何设置KRYO的不可修改的Collection串行火花代码

Caused by: java.lang.UnsupportedOperationException 
     at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055) 
     at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:102) 
     at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:18) 
     at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:648) 
     at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:605) 
     ... 27 more 

我发现这是因为Kryo的默认CollectionSerializer无法反序列化集合,因为它不可修改,我们应该使用UnmodifiableCollectionsSerializer。

我如何在Spark代码中特别提到使用UnryFormCollectionsSerializer for Kryo?

我现在的配置是 -

SparkConf conf = new SparkConf().setAppName("ABC"); 
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); 
conf.registerKryoClasses(new Class<?>[] {*list of classes I want to register*}); 

如果任何人面对这样的问题,这里是解决方案 - 我把它用javakaffee KRYO串行工作。

添加以下Maven的依赖:

<dependency> 
     <groupId>de.javakaffee</groupId> 
     <artifactId>kryo-serializers</artifactId> 
     <version>0.42</version> 
</dependency> 

编写自定义KRYO registrator注册UnmodifiableCollectionsSerializer

public class CustomKryoRegistrator implements KryoRegistrator { 
     @Override 
     public void registerClasses(Kryo kryo) {   
      UnmodifiableCollectionsSerializer.registerSerializers(kryo); 
     } 
    } 

设置spark.kryo.registrator到自定义registrator的完全限定名称

参考 -

https://github.com/magro/kryo-serializers

Spark Kryo: Register a custom serializer

+0

普加感谢素洁。这个解决方案像魅力工作! –