参考资料:https://spark.apache.org/docs/2.4.1/tuning.html (官网地址)
前言
一直都在说kyro序列化,这一块对于spark在序列化这块性能提升比较大,今天研究下
spark的序列化机制
spark提供2个序列化库
- 1、Java serialization
java 序列化库很灵活但是很慢,序列化对象占用的空间大。
- 2、Kryo serialization
kyro序列化更块更紧凑,但是不支持所有的Serializable 类型,需要去预先注册
更改序列化库
可以使用这个配置来修改序列化库
spark.serializer
默认为 org.apache.spark.serializer.JavaSerializer
如果打算替换Kryo为 org.apache.spark.serializer.KryoSerializer
替换为Kryo序列化库存在的问题
kyro预先注册需要手动注册,通过类似于这种方式
conf.registerKryoClasses(Array(classOf[Info], classOf[scala.collection.mutable.WrappedArray.ofRef[_]]))
kyro有相应的配置
spark.kryo.registrationRequired
默认为false。如果修改为true的话,如果有类没有注册kyro类的话,会抛出异常。如果为false则会写入未注册的类名和对象一起,显著增大性能开销。
个人感觉:如果项目稳定的话,代码修改量小的时候,可以使用kryo这种方式,可以加上spark.kryo.registrationRequired 配置,来检测哪个类没有被注册。在频繁变动的场景的话,并且对性能要求不高,java序列化就足够。