簡體   English   中英

Spark:數據集序列化

[英]Spark: Dataset Serialization

如果我有一個數據集,其中每個記錄都是一個案例類,並且我會按如下所示保留該數據集,以便使用序列化:

myDS.persist(StorageLevel.MERORY_ONLY_SER)

Spark 是否使用 java/kyro 序列化來序列化數據集? 或者就像數據幀一樣,Spark 有自己的方式將數據存儲在數據集中?

Spark Dataset不使用標准序列化程序。 相反,它使用Encoders ,它“理解”數據的內部結構,並且可以有效地將對象(任何具有Encoder對象,包括Row )轉換為內部二進制存儲。

使用 Kryo 或 Java 序列化的唯一情況是當您顯式應用Encoders.kryo[_]Encoders.java[_] 在任何其他情況下,Spark 將解構對象表示並嘗試應用標准編碼器(原子編碼器、 Product編碼器等)。 Row相比唯一的區別是它的Encoder - RowEncoder (從某種意義上說, Encoders類似於鏡頭)。

Databricks 在其Introducing Apache Spark Datasets 中明確地將Encoder / Dataset序列化與 Java 和 Kryo 序列化Encoder形成對比(尤其是使用編碼器的閃電快速序列化部分)

在此處輸入圖片說明

在此處輸入圖片說明

圖片來源

Dataset[SomeCaseClass]Dataset[Row]或任何其他Dataset沒有區別。 它使用相同的內部表示(在需要的時候被映射到外部類的實例)和相同的序列化方法。

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

在幕后,數據集是一個 RDD。 來自RDD 持久性文檔

將 RDD 存儲為序列化的 Java 對象(每個分區一個字節數組)。 這通常比反序列化對象更節省空間,尤其是在使用快速序列化程序時,但讀取時更占用 CPU。

默認情況下,Java 序列化使用source

默認情況下,Spark 使用 Java 的 ObjectOutputStream 框架序列化對象……Spark 還可以使用 Kryo 庫(版本 2)更快地序列化對象。

要啟用KRYO,初始化與SparkConf和設置作業spark.serializerorg.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]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM