Flink中使用Kryo序列化器的注意事项

本文探讨了在Flink环境中使用Kryo序列化时遇到的ClassNotFound问题,并提供了具体的解决方案,包括设置正确的类加载器及调整Flink配置。

你以为我要说的是在Flink中使用Kryo序列化吗?不是的,还记得上一篇关于Kryo序列化的问题的文章:Kryo序列化:Class Not Found的可能原因.

里面介绍了因为在Spark环境下由于类加载器原因导致Kryo反序列化时找不到类的问题。

没错,还有续集。这次是在Flink下,也出现了同样的问题。

问题复现

见如下代码,是Flink提交给YARN的主函数类,里面反序列化一个 StreamParam的参数类。这个类就在提交的jar包里。
(KryoSerializer是我们自己封装了下Kryo,里面还是Kryo实例。)

object MyFlinkDriver {
   
   

  def main(args: Array[String]): Unit = {
   
   
    Assert.paramMiss(args.length > 0, "StreamParam JsonString")

    val param = KryoSerializer.deserialize(
 
Flink中测试不同序列化器性能,可借助Flink基准项目,该项目在https://github.com/dataArtisans/flink-benchmarks ,它在Flink之上添加了一些微基准(有些比其他更低级)来跟踪性能回归和改进。Flink用于监控序列化堆栈性能的持续基准在`SerializationFrameworkMiniBenchmarks.java`中实现[^1]。 以下是一个简单示例来体现性能测试的思路,假设要测试不同序列化器对一个自定义对象的序列化和反序列化时间: ```java import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; // 自定义对象 class CustomObject implements Serializable { private String data; public CustomObject(String data) { this.data = data; } public String getData() { return data; } } public class SerializationPerformanceTest { public static void main(String[] args) throws IOException, ClassNotFoundException { CustomObject obj = new CustomObject("test data"); // Java序列化测试 long javaStartTime = System.currentTimeMillis(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); byte[] javaSerializedData = bos.toByteArray(); ByteArrayInputStream bis = new ByteArrayInputStream(javaSerializedData); ObjectInputStream ois = new ObjectInputStream(bis); CustomObject javaDeserializedObj = (CustomObject) ois.readObject(); long javaEndTime = System.currentTimeMillis(); System.out.println("Java Serialization time: " + (javaEndTime - javaStartTime) + " ms"); // Kryo序列化测试 Kryo kryo = new Kryo(); long kryoStartTime = System.currentTimeMillis(); Output output = new Output(new ByteArrayOutputStream()); kryo.writeObject(output, obj); byte[] kryoSerializedData = output.toBytes(); Input input = new Input(new ByteArrayInputStream(kryoSerializedData)); CustomObject kryoDeserializedObj = kryo.readObject(input, CustomObject.class); long kryoEndTime = System.currentTimeMillis(); System.out.println("Kryo Serialization time: " + (kryoEndTime - kryoStartTime) + " ms"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值