Spark 数据集编码器:kryo() 与 bean()

Spark dataset encoders: kryo() vs bean()

在 Spark 中处理数据集时,我们需要指定用于序列化和反序列化对象的编码器。我们可以选择使用 Encoders.bean(Class<T>)Encoders.kryo(Class<T>).

它们有何不同?使用其中一种与另一种相比对性能有何影响?

出于多种原因,始终建议使用 Kryo 序列化 Java 序列化。其中一些在下面。

  • Kryo 序列化比 Java 序列化更快。
  • Kryo 序列化使用的内存占用更少,尤其是在您可能需要 Cache()Persist() 的情况下。这在 Shuffling.
  • 等阶段非常有用
  • 虽然 Kryo 支持缓存和混洗,但在持久化到磁盘期间不支持。
  • RDD 上的
  • saveAsObjectFileSparkContext 上的 objectFile 方法仅支持 java 序列化。
  • 您在数据集中处理的自定义数据类型越多,处理它们就越复杂。因此,通常最好的做法是使用像 Kryo 这样的统一序列化。
  • Java 的序列化框架是出了名的低效,消耗太多 CPU、RAM 和大小,无法成为合适的大规模序列化​​格式。
  • Java 序列化需要在序列化 objects.But 时存储完全限定的 class 名称,Kryo 让您通过 saving/registering 和 classes sparkConf.registerKryoClasses(Array( classOf[A], classOf[B], ...))sparkConf.set("spark.kryo.registrator", "MyKryoRegistrator")。这节省了大量 space 并避免了不必要的元数据。

bean()javaSerialization() 之间的区别是 java序列化使用通用 java 序列化来序列化 T 类型的对象。此编码器将 T 映射到单个字节数组(二进制)字段。其中 as bean 为 Java 类型 T 的 Bean 创建编码器。它们都使用 Java 序列化,唯一的区别是它们如何将对象表示为字节。

引用文档

JavaSerialization is extremely inefficient and should only be used as the last resort.