Spark Kryo序列化与Java序列化对比
请比较Spark中Java序列化和Kryo序列化的性能差异,说明如何配置Kryo序列化以及哪些场景收益最大。
回答
小字辈
性能对比: | 维度 | Java序列化 | Kryo序列化 | |------|-----------|-----------| | 速度 | 慢(反射+对象图遍历) | 快(直接操作字节码,10×更快)| | 序列化大小 | 大(包含类元数据) | 小(Java的1/5~1/10)| | 兼容性 | 所有Serializable类 | 需要注册Class(或使用无参构造)| | GC压力 | 大(大量临时对象) | 小 |
配置方法:
val conf = new SparkConf()
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryo.registrationRequired", "true") // 要求注册,避免性能回退
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
收益最大的场景:
- Shuffle数据量大:Shuffle写磁盘/网络传输大量自定义对象
- RDD Cache:RDD缓存到内存/磁盘时序列化存储
- UDF中产生大量中间对象:避免GC开销
- Broadcast大变量:广播变量序列化传输
注意点:
- 未注册的类Kryo也能处理,但性能回退到Java级别
- 使用
spark.kryoserializer.buffer.max(默认64MB)控制最大缓冲区 - 对Scala case class和集合类(List/Map等)Kryo默认支持
- Spark内部数据类型(Row等)已内置注册