[英]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 存儲為序列化的 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]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.