如何在Spark代码

时间:2017-10-18 20:01:41

标签: apache-spark kryo

我在Java中使用Spark(v1.6.1)中的Kryo序列化,并且在序列化其字段中具有集合的类时,会引发以下错误 -

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代码中特别提及为Kryo使用UnmodifiableCollectionsSerializer?

我目前的配置是 -

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*});

1 个答案:

答案 0 :(得分:4)

如果有其他人遇到这个问题,这里有解决方案 - 我通过使用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的完全限定名称

conf.set("spark.kryo.registrator", "com.abc.CustomKryoRegistrator");

参考文献 -

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

Spark Kryo: Register a custom serializer