【问题标题】:Spark: Dataset SerializationSpark:数据集序列化
【发布时间】:2018-06-07 14:01:19
【问题描述】:

如果我有一个数据集,其中的每条记录都是一个案例类,并且我按如下所示持久化该数据集以便使用序列化:

myDS.persist(StorageLevel.MERORY_ONLY_SER)

Spark 是否使用 java/kyro 序列化来序列化数据集?或者就像 dataframe 一样,Spark 有自己的方式在数据集中存储数据?

【问题讨论】:

    标签: scala apache-spark serialization apache-spark-dataset


    【解决方案1】:

    Spark Dataset 不使用标准序列化程序。相反,它使用Encoders,它“理解”数据的内部结构并可以有效地将对象(任何具有Encoder,包括Row)转换为内部二进制存储。

    使用 Kryo 或 Java 序列化的唯一情况是当您 explicitly apply Encoders.kryo[_]Encoders.java[_] 时。在任何其他情况下,Spark 都会解构对象表示并尝试应用标准编码器(原子编码器、Product 编码器等)。与Row 相比的唯一区别是它的Encoder - RowEncoder(在某种意义上Encoders 类似于镜头)。

    Databricks 在其 Introducing Apache Spark Datasets 中明确将 Encoder / Dataset 序列化与 Java 和 Kryo 序列化器进行对比(特别注意 Lightning-fast Serialization with Encoders 部分)

    图片来源

    【讨论】:

    • 这完全正确,几乎总是推荐使用 Kyro serde lib。因为它比 Java serde 快得多,而且性能改进很多。它还与 Java serde 框架无缝集成。所以 java.io.Serializable 是 Kyro 唯一需要序列化您的自定义数据结构的东西。看具体例子:stackoverflow.com/questions/53329178/…
    【解决方案2】:

    在底层,数据集是一个 RDD。来自documentation for RDD persistence

    将 RDD 存储为序列化的 Java 对象(每个分区一个字节数组)。这通常比反序列化对象更节省空间,尤其是在使用快速序列化程序时,但读取时更占用 CPU。

    默认使用Java序列化source

    默认情况下,Spark 使用 Java 的 ObjectOutputStream 框架序列化对象……Spark 还可以使用 Kryo 库(版本 2)更快地序列化对象。

    要启用 Kryo,请使用 SparkConf 初始化作业并将 spark.serializer 设置为 org.apache.spark.serializer.KryoSerializer

    val conf = new SparkConf()
                 .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    val sc = new SparkContext(conf)
    

    您可能需要在创建 SparkContext 之前向 Kryo 注册类:

    conf.registerKryoClasses(Array(classOf[Class1], classOf[Class2]))
    

    【讨论】:

      【解决方案3】:

      Dataset[SomeCaseClass]Dataset[Row] 或任何其他Dataset 没有区别。它使用相同的内部表示(在需要时映射到外部类的实例)和相同的序列化方法。

      因此,不需要直接的对象序列化(Java、Kryo)。

      【讨论】:

      • 在最近的Spark版本中,我们主要有DataSet和Dataframe,Dataframe只是Dataset的一个特例。那么,如果序列化对 Datasets 没有影响,那么 Spark 开发人员为什么要推动 Kyro 呢?所以,我不确定你上面说的是否准确。我认为如果 Dataframe 记录是对象,那么这些对象就会被序列化。所以,Dataset 本身可能不使用序列化,但对象是序列化的。
      猜你喜欢
      • 2017-11-27
      • 2018-06-07
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2018-08-05
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多