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

本文介绍了一个Spark应用在Livy环境下遇到的Kryo反序列化找不到类的问题及解决方案。通过调整Kryo的类加载器设置,解决了类加载冲突,确保了程序正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近写了个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上执行,发现是可以找到的:
json
通过报错异常链,我找到Kryo源码对应地方:com.esotericsoftware.kryo.util.DefaultClassResolver#readName
code

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值