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 上的 saveAsObjectFile
和 SparkContext
上的 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.
在 Spark 中处理数据集时,我们需要指定用于序列化和反序列化对象的编码器。我们可以选择使用 Encoders.bean(Class<T>)
或 Encoders.kryo(Class<T>)
.
它们有何不同?使用其中一种与另一种相比对性能有何影响?
出于多种原因,始终建议使用 Kryo 序列化 Java 序列化。其中一些在下面。
- Kryo 序列化比 Java 序列化更快。
- Kryo 序列化使用的内存占用更少,尤其是在您可能需要
Cache()
和Persist()
的情况下。这在Shuffling
. 等阶段非常有用
- 虽然 Kryo 支持缓存和混洗,但在持久化到磁盘期间不支持。 RDD 上的
saveAsObjectFile
和SparkContext
上的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.