在 Spark 中处理数据集时,我们需要指定编码器来序列化和反序列化对象。我们可以选择使用Encoders.bean(Class<T>)
or Encoders.kryo(Class<T>)
.
它们有何不同?使用其中一种与另一种相比对性能有何影响?
出于多种原因,始终建议使用 Kryo 序列化到 Java 序列化。其中一些如下。
- Kryo 序列化比 Java 序列化更快。
- Kryo 序列化使用更少的内存占用,尤其是在您可能需要的情况下
Cache()
and Persist()
。这在以下阶段非常有帮助:Shuffling
.
- 尽管 Kryo 支持缓存和混洗,但在磁盘持久化期间不支持。
-
saveAsObjectFile
在 RDD 上和objectFile
方法上SparkContext
仅支持java序列化。
- 您在数据集中处理的自定义数据类型越多,处理它们的复杂性就越高。因此,使用像 Kryo 这样的统一序列化通常是最佳实践。
- Java 的序列化框架是出了名的低效,它消耗太多的 CPU、RAM 和大小,无法成为合适的大规模序列化格式。
- Java 序列化在序列化对象时需要存储完全限定的类名。但是,Kryo 可以通过保存/注册类来避免这种情况
sparkConf.registerKryoClasses(Array( classOf[A], classOf[B], ...))
or sparkConf.set("spark.kryo.registrator", "MyKryoRegistrator")
。这节省了大量空间并避免了不必要的元数据。
之间的区别bean()
and javaSerialization()
java序列化是序列化类型的对象T
使用通用的java序列化。该编码器映射T
转换为单字节数组(二进制)字段。其中 as bean 为 Java Bean 类型创建编码器T
。它们都使用 Java 序列化,唯一的区别是它们如何将对象表示为字节。
引用自文档
JavaSerialization 效率极低,只能用作
最后一招。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)