spark之kryo 序列化

几乎所有的资料都显示kryo 序列化方式优于java自带的序列化方式,而且在spark2.*版本中都是默认采用kryo 序列化。因此本文将做kryo 做一个测试以验证其性能。

1.先给出定义:
    把对象转换为字节序列的过程称为对象的序列化。
    把字节序列恢复为对象的过程称为对象的反序列化。

通俗地说序列化就是把内存(jvm)中一个对象的状态通过网络传输,或者保存到磁盘上,反序列化与之相反。

2.spark中的序列化
那么对象以何种形式进行传输性能更好呢?
在spark2.0+版本的官方文档中提到:spark默认提供了两个序列化库:Java自身的序列化和Kryo序列化
官网的解释是:java序列化灵活,但是速度缓慢。Kryo序列化速度更快且更紧凑,但是支持的类型较少。

而且spark现在已经默认RDD在shuffle的时候对简单类型使用了Kryo序列化。

3.如何使用kryo 序列化
spark中已经包含了kryo库,使用kryo只需要注册即可。官网只提供了scala版本的,java版本的如下:

spark之kryo 序列化

或者:System.setProperty("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
两者都可以用,但是我测试好像没起到什么效果。于是需要手动注册:

spark之kryo 序列化

上图是关于kryo 的一些配置,可以单独注册自己的一个类,如紫色框线部分;
也可以像红色框线部分一样,自定义一个接口实现类MyKryoRegistrator,在这个类里面将所需的类全部注册。具体操作如下图:
如果需要序列化的类太多,就在这里逐一列举即可,当然被注册的类要实现java.io.Serializable,即:class TestKryo implements Serializable

spark之kryo 序列化

4.序列化的效果
为了验证效果,我写了个test程序:

spark之kryo 序列化

5.测试结果:
三种不同情况下的的RDD大小:
默认不序列化:2017.0 KB
在MyKryoRegistrator中序列化: 960.2 KB
只序列化demo.TestKryo:1053.0 KB

完。。。