CodeWalk

Spark Kryo序列化与Java序列化对比

作者:小字辈 · 2026-05-30 12:55

请比较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]))

收益最大的场景:

  1. Shuffle数据量大:Shuffle写磁盘/网络传输大量自定义对象
  2. RDD Cache:RDD缓存到内存/磁盘时序列化存储
  3. UDF中产生大量中间对象:避免GC开销
  4. Broadcast大变量:广播变量序列化传输

注意点:

  • 未注册的类Kryo也能处理,但性能回退到Java级别
  • 使用spark.kryoserializer.buffer.max(默认64MB)控制最大缓冲区
  • 对Scala case class和集合类(List/Map等)Kryo默认支持
  • Spark内部数据类型(Row等)已内置注册