当前位置: 首页 > 工具软件 > Kryo > 使用案例 >

Spark Kryo探索

郑松
2023-12-01

作用

spark中序列化发生在rdd的缓存、shuffle的阶段,是一个比较频繁的操作。但是如果没有特别设置,spark在进行序列化时会使用Java原生的序列化方式,也就是让序列化的类实现java.io.Serializable接口。但是原生的java序列化方式效率很低,默认的writeObjectreadObject基本不会被重写,因此需要有其他能够提升序列化部分的效率的方式。
在spark的官方文档中,提供了两种序列化的方式,分别是Java SerializationKryo Serialization。官方文档中对Kryo的说明是:

Kryo serialization: Spark can also use the Kryo library (version 4) to serialize objects more quickly. Kryo is significantly faster and more compact than Java serialization (often as much as 10x), but does not support all Serializable types and requires you to register the classes you’ll use in the program in advance for best performance.

看了下,说Kryo序列化的速度是java序列化速度的10x。值得一试。

如何配置

有两种办法:
1、通过sparkConf直接对类进行注册;

SparkConf sparkConf = new SparkConf();
// other settings
// sparkConf.set("xxx","xxxx");
// regist your serialize class
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
sparkConf.registerKryoClasses(new Class[]{A.class, B.class});

2、通过自定义注册器对类进行注册;

public class ReconKryoRegistrator implements KryoRegistrator {
    @Override
    public void registerClasses(Kryo kryo) {
        kryo.register(A.class);
        kryo.register(B.class);
    }
}
 SparkConf sparkConf = new SparkConf();
 sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
 sparkConf.set("spark.kryo.registrator", "xxx.xxx.ReconKryoRegistrator");

其他问题

如果按照上面这么配置,对于没有注册的类会怎么办?
对于没有注册的类,spark也不会fallback回来使用java原生的序列化方式,而是继续使用Kryo序列化方式,并在众多的序列化器中选择一个合适的。当最后选择的序列化器是默认的序列化器时,会为该类的每一个对象注明他的类名,额外花费1-2 byte。
如果想要节省类名的时间,那就要添加如下配置:

sparkConf.set("spark.kryo.registrationRequired","true");	

但是这样一来,就必要把所有的类都给加上,否则会报runtime error。比如有RDD(A,B,C),那么还需要注册Tuple(A,B,C),非常繁琐。
因此,建议对大部分自己键的以及常用工具类进行注册,同时将registrationRequired设置为false。

参考文献

  • https://spark.apache.org/docs/latest/tuning.html
  • https://spark.apache.org/docs/latest/configuration.html
  • https://stackoverflow.com/questions/31394140/require-kryo-serialization-in-spark-scala
  • https://blog.knoldus.com/kryo-serialization-in-spark/
 类似资料: