spark之kryo 序列化

幾乎所有的資料都顯示kryo 序列化方式優於java自帶的序列化方式,而且在spark2.*版本中都是默認採用kryo 序列化。因此本文將做kryo 做一個測試以驗證其性能。

1.先給出定義:
    把對象轉換爲字節序列的過程稱爲對象的序列化。
    把字節序列恢復爲對象的過程稱爲對象的反序列化。

通俗地說序列化就是把內存(jvm)中一個對象的狀態通過網絡傳輸,或者保存到磁盤上,反序列化與之相反。

2.spark中的序列化
那麼對象以何種形式進行傳輸性能更好呢?
在spark2.0+版本的官方文檔中提到:spark默認提供了兩個序列化庫:Java自身的序列化和Kryo序列化
官網的解釋是:java序列化靈活,但是速度緩慢。Kryo序列化速度更快且更緊湊,但是支持的類型較少。

而且spark現在已經默認RDD在shuffle的時候對簡單類型使用了Kryo序列化。

3.如何使用kryo 序列化
spark中已經包含了kryo庫,使用kryo只需要註冊即可。官網只提供了scala版本的,java版本的如下:

或者:System.setProperty("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
兩者都可以用,但是我測試好像沒起到什麼效果。於是需要手動註冊:


上圖是關於kryo 的一些配置,可以單獨註冊自己的一個類,如紫色框線部分;
也可以像紅色框線部分一樣,自定義一個接口實現類MyKryoRegistrator,在這個類裏面將所需的類全部註冊。具體操作如下圖:
如果需要序列化的類太多,就在這裏逐一列舉即可,當然被註冊的類要實現java.io.Serializable,即:class TestKryo implements Serializable

4.序列化的效果
爲了驗證效果,我寫了個test程序:


5.測試結果:
三種不同情況下的的RDD大小:
默認不序列化:2017.0 KB
在MyKryoRegistrator中序列化: 960.2 KB
只序列化demo.TestKryo:1053.0 KB

完。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章