繁体   English   中英

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 支持缓存和改组,但在持久化到磁盘期间不支持。
  • saveAsObjectFile上RDD和objectFile方法上SparkContext仅支持Java序列。
  • 您在数据集中处理的自定义数据类型越多,处理它们的复杂性就越高。 因此,通常最好的做法是使用像 Kryo 这样的统一序列化。
  • Java 的序列化框架效率低下是出了名的,消耗过多的 CPU、RAM 和大小,无法成为合适的大规模序列化​​格式。
  • Java 序列化需要在序列化对象时存储完全限定的类名。但是,Kryo 允许您通过保存/注册类sparkConf.registerKryoClasses(Array( classOf[A], classOf[B], ...))sparkConf.set("spark.kryo.registrator", "MyKryoRegistrator") 这节省了大量空间并避免了不必要的元数据。

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

从文档中引用

JavaSerialization 效率极低,只能作为最后的手段使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM