【发布时间】:2018-10-25 15:14:17
【问题描述】:
在 Spark 中处理数据集时,我们需要指定编码器来序列化和反序列化对象。我们可以选择使用Encoders.bean(Class<T>) 或Encoders.kryo(Class<T>)。
这些有何不同?使用一个与另一个对性能有何影响?
【问题讨论】:
标签: apache-spark apache-spark-dataset encoder kryo
在 Spark 中处理数据集时,我们需要指定编码器来序列化和反序列化对象。我们可以选择使用Encoders.bean(Class<T>) 或Encoders.kryo(Class<T>)。
这些有何不同?使用一个与另一个对性能有何影响?
【问题讨论】:
标签: apache-spark apache-spark-dataset encoder kryo
出于多种原因,始终建议使用 Kryo 序列化到 Java 序列化。其中一些如下。
Cache() 和Persist() 的情况下。这在Shuffling 等阶段非常有用。saveAsObjectFile 和SparkContext 上的objectFile 方法仅支持java 序列化。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 效率极低,只能用作 最后的手段。
【讨论】: