1. 程式人生 > >spark效能調優---Kryo序列化

spark效能調優---Kryo序列化

1.為啥要用Kryo序列化

Spark運算元操作的時候如果用到外部資料的話,都會對外部資料進行序列化,Spark內部是使用Java的序列化機制,ObjectOutputStream / ObjectInputStream,物件輸入輸出流機制,來進行序列化這種預設序列化機制的好處在於,處理起來比較方便;也不需要我們手動去做什麼事情,只是,你在運算元裡面使用的變數,必須是實現Serializable介面的,可序列化即可。但是缺點個人覺得預設的序列化機制的效率不高,序列化的速度比較慢;序列化以後的資料,佔用的記憶體空間相對還是比較大。但是Spark支援使用Kryo序列化機制。Kryo序列化機制,比預設的Java序列化機制,速度要快,序列化後的資料要更小,大概是Java序列化機制的1/10。所以Kryo序列化優化以後,可以讓網路傳輸的資料變少;在叢集中耗費的記憶體資源大大減少。

2.Kryo序列化機制,一旦啟用以後,會生效的幾個地方

a、運算元函式中使用到的外部變數,使用Kryo以後:優化網路傳輸的效能,可以優化叢集中記憶體的佔用和消耗

b、持久化RDD,優化記憶體的佔用和消耗;持久化RDD佔用的記憶體越少,task執行的時候,建立的物件,就不至於頻繁的佔滿記憶體,頻繁發生GC。

c、shuffle:可以優化網路傳輸的效能

3.如何使用Kryo序列化機制(摘自Spark官網)

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
val sc = new SparkContext(conf)

為啥spark預設的序列化機制不改成Kryo序列化機制呢?難道就因為要去註冊序列化的類的原因嗎?