【问题标题】:Spark dataset encoders: kryo() vs bean()Spark 数据集编码器:kryo() 与 bean()
【发布时间】:2018-10-25 15:14:17
【问题描述】:

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

这些有何不同?使用一个与另一个对性能有何影响?

【问题讨论】:

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


    【解决方案1】:

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

    • Kryo 序列化比 Java 序列化更快。
    • Kryo 序列化使用更少的内存占用,尤其是在您可能需要Cache()Persist() 的情况下。这在Shuffling 等阶段非常有用。
    • 虽然支持 Kryo 进行缓存和洗牌,但在持久化到磁盘期间不支持。
    • RDD 上的saveAsObjectFileSparkContext 上的objectFile 方法仅支持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 效率极低,只能用作 最后的手段。

    【讨论】:

    • 感谢您的快速响应和详细的要点。在这里,您将 java 序列化与 kryo 进行了比较。如果我们看一下编码器,其中有 3 个 - javaSerialization()、kryo() 和 bean()。我的问题是比较 kryo() 和 bean()。在您的观点中,当您谈论 java 序列化时,您指的是哪一个? bean() 是否也使用 java 序列化?如果是,bean() 和 javaSerialization() 有什么区别?
    • 非常感谢您的澄清。本质上,我们可以说应该使用的默认值是 kryo()。
    猜你喜欢
    • 2021-01-19
    • 2016-11-25
    • 1970-01-01
    • 2019-05-30
    • 2017-11-27
    • 2017-08-31
    • 2015-08-30
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多