当Kryo序列化与Spark一起使用时,ProtoBuf中的NullPointerException [英] NullPointerException in ProtoBuf when Kryo serialization is used with Spark

查看:298
本文介绍了当Kryo序列化与Spark一起使用时,ProtoBuf中的NullPointerException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试序列化protobuf字段时,我的spark应用程序遇到以下错误,该字段是键String和值float的映射.Spark应用程序正在使用Kryo序列化.

I am getting the following error in my spark application when it is trying to serialize a protobuf field which is a map of key String and value float. Kryo serialization is being used in the spark app.

Caused by: java.lang.NullPointerException
    at com.google.protobuf.UnmodifiableLazyStringList.size(UnmodifiableLazyStringList.java:68)
    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:731)
    at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)
    ... 71 more

以前有人遇到过这个问题吗?有办法解决吗?

Has anyone faced this issue before? Is there a way to resolve it?

推荐答案

您可以使用kryo注册ProtobufSerializer来序列化protobufs

You can register ProtobufSerializer with kryo to serialize protobufs

  • 首先:添加dep:
"de.javakaffee" % "kryo-serializers" % "0.43" // in sbt

  • 第二次:扩展kryo序列化器
  • package com.my.serializer
    
    class ExtendedKryoRegistrator extends KryoRegistrator {
      override def registerClasses(kryo: Kryo): Unit = {
        kryo.register(classOf[YourProtoMessageClass], new ProtobufSerializer())
      }
    }
    

    • 第三:使用 ExtendedKryoRegistrator
    • 设置spark conf

      • third: set the spark conf with ExtendedKryoRegistrator
      • val conf = new SparkConf().setAppName("appName")
        
        conf.set("spark.kryo.registrator", "com.my.serializer.ExtendedKryoRegistrator")
        
                
        val spark = SparkSession.builder()
          .config(conf)
          .enableHiveSupport()
          .getOrCreate()
        

        这篇关于当Kryo序列化与Spark一起使用时,ProtoBuf中的NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆