Kryo序列化:Class Not Found的可能原因

Posted 境悟初

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kryo序列化:Class Not Found的可能原因相关的知识,希望对你有一定的参考价值。

最近写了个Spark应用,本地测试没问题,打成jar包,通过Livy运行Spark常驻服务,在Livy接收参数时使用Kryo进行反序列化却找不到类。

示例代码如下:

object LivyDriver 

  def runJob(spark: SparkSession, encodeJsonParam: String): String = 
    val param = KryoSerializer.deserialize(EncodeUtil.base64DecodeBytes(encodeJsonParam)).asInstanceOf[MySparkParam]
    val res = MyApp.execute(param, spark)
    if (res == null) ok(param)
    else fail(param, res)
  

我的排查思路是手动提交如下代码到Livy上执行,发现是可以找到的:

通过报错异常链,我找到Kryo源码对应地方:com.esotericsoftware.kryo.util.DefaultClassResolver#readName

所以我猜测是类加载器导致的。

果然,当我打印出 LivyDriver和Kryo的类加载器,确实不是一个实例。于是我手动给Kryo的实例设置类加载器

// Kryo kryo = new Kryo();
kryo.setClassLoader(LivyDriver.getClass.getClassLoader);

总结:
类加载器是基础知识,结合读源码能够很快解决问题,而不是背诵面试题,工作考验的是解决问题的能力,是一个综合能力。

以上是关于Kryo序列化:Class Not Found的可能原因的主要内容,如果未能解决你的问题,请参考以下文章

SparkSpark Class is not registered joins UnsafeHashedRelation kryo

com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID

Kryo序列化器(快速上手)

Spark---序列化(Kryo)

delphi程序问题:Class TComPort not found. lgnore the error and continue?

expect spawn not found