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

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

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

示例代码如下:

object LivyDriver {
   
   

  def runJob(spark: SparkSession, encodeJsonParam: String): String = {
   
   
    val param = KryoSerializer.deserialize(EncodeUtil.base64DecodeBytes
Spark 中报 "no Java class corresponding to Product with Serializable found" 错误通常是因为你在尝试序列化一个自定义的类 `Product`,但是这个类没有添加 `Serializable` 接口或者相应的序列化支持。 `Serializable` 是 Java 的一个标准接口,用于让对象能够在跨线程、跨越网络等需要持久化的场景下进行序列化和反序列化操作。如果你的 `Product` 类没有显式声明为 `Serializable` 或者没有提供序列化逻辑(如使用 `transient` 关键字、`KryoSerializer` 或自定义序列化器),Spark 就无法找到合适的序列化机制来处理这个类。 解决这个问题有以下几个步骤: 1. **添加 `Serializable` 接口**:确保 `Product` 类上添加了 `Serializable` 接口。 ```java public class Product implements Serializable { //... } ``` 2. **提供默认的序列化实现**:如果没有特殊需求,可以直接使用默认的 Java 序列化,不需要额外配置。如果你有自己的复杂数据结构,可以考虑使用第三方库如 Kryo 或 Protobuf 进行更高效的序列化。 3. **检查序列化兼容性**:如果 `Product` 有一个复杂的内部结构,确保所有成员变量也是可序列化的。对于不可序列化的对象,比如集合、引用类型,你需要将它们转换成可序列化的形式。 4. **配置 Spark序列化的选择**:如果你使用的是 Apache Spark 的 Hadoop 配置,确保正确的序列化器被配置。例如,在 `spark-defaults.conf` 文件中设置 `spark.serializer` 为你选择的序列化器(如 `org.apache.spark.serializer.KryoSerializer`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值