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

时间:2018-05-15 17:26:47

标签: apache-spark apache-spark-dataset encoder

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

这些不同,使用一个与另一个相比有什么性能影响?

1 个答案:

答案 0 :(得分:1)

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

  • Kryo序列化比Java序列化更快。
  • Kryo序列化使用较少的内存占用,特别是在您需要Cache()Persist()的情况下。这在Shuffling
  • 等阶段非常有用
  • 虽然Kryo支持缓存和随机播放,但在磁盘持久化期间不支持Kryo。
  • 关于RDD的
  • saveAsObjectFileobjectFile上的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 Serialization,唯一的区别是它们如何将对象表示为字节。

从文档中引用

  

JavaSerialization效率极低,只能用作   不得已。