Spark序列化

25minutes發表於2021-09-09

Java序列化

有關Java物件的序列化和反序列化也算是Java基礎的一部分,首先對Java序列化的機制和原理進行一些介紹。

Java序列化演算法

Serialization(序列化)是一種將物件以一連串的位元組描述的過程;反序列化deserialization是一種將這些位元組重建成一個物件的過程。Java序列化API提供一種處理物件序列化的標準機制。

為什麼要進行序列化?

Java中,一切都是物件,在分散式環境中經常需要將Object從這一端網路或裝置傳遞到另一端。這就需要有一種可以在兩端傳輸資料的協議。Java序列化機制就是為了解決這個問題而產生。

如何進行序列化?

一個物件能夠序列化的前提是實現Serializable介面,Serializable介面沒有方法,更像是個標記。有了這個標記的Class就能被序列化機制處理。

1、實現Serializable介面


圖片描述


2、寫個程式將物件序列化並輸出(ObjectOutputStream能把Object輸出成Byte流。將Byte流暫時儲存到serial.out檔案裡)

圖片描述

3、使用ObjectInputStream從持久的檔案中讀取Bytes重建物件

圖片描述

Spark序列化

透過以上內容大概瞭解了序列化和反序列化的原理,接下來看看Spark的序列化

大部分Spark程式都具有“記憶體計算”的天性,所以叢集中的所有資源:CPU、網路頻寬或者是記憶體都有可能成為Spark程式的瓶頸。

通常情況下,如果資料完全載入到記憶體那麼網路頻寬就會成為瓶頸,但是你仍然需要對程式進行最佳化,例如採用序列化的方式儲存RDD資料以便減少記憶體使用。

資料序列化不但能提高網路效能還能減少記憶體使用。

Spark透過兩種方式來建立序列化器

序列化

在預設情況下,Spark採用Java的ObjectOutputStream序列化一個物件。該方式適用於所有實現了的類。透過繼承,你能進一步控制序列化的效能。Java序列化非常靈活,但是速度較慢,在某些情況下序列化的結果也比較大。

序列化

Spark也能使用Kryo(版本2)序列化物件。Kryo不但速度極快,而且產生的結果更為緊湊(通常能提高10倍)。Kryo的缺點是不支援所有型別,為了更好的效能,你需要提前註冊程式中所使用的類(class)。

Java的序列化比較簡單,就和前面的一樣,下面主要介紹序列化的使用。

序列化怎麼用?

可以在建立SparkContext之前,透過呼叫System.setProperty("spark.serializer", "spark.KryoSerializer"),將序列化方式切換成Kryo。

但是Kryo需要使用者進行註冊,這也是為什麼Kryo不能成為Spark序列化預設方式的唯一原因,但是建議對於任何“網路密集型”(network-intensive)的應用,都採用這種方式進行序列化方式。

文件描述了很多便於註冊的高階選項,例如新增使用者自定義的序列化程式碼。

如果物件非常大,你還需要增加屬性spark.kryoserializer.buffer.mb的值。該屬性的預設值是32,但是該屬性需要足夠大以便能夠容納需要序列化的最大物件。

最後,如果你不註冊你的類,Kryo仍然可以工作,但是需要為了每一個物件儲存其對應的全類名(full class name),這是非常浪費的。

圖片描述

以上是Spark序列化簡單的應用,如有錯誤請指正...~



作者:利伊奧克兒
連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4328/viewspace-2818775/,如需轉載,請註明出處,否則將追究法律責任。

相關文章