您好,登錄后才能下訂單哦!
這篇文章主要介紹“spark kryo序列化怎么實現”,在日常操作中,相信很多人在spark kryo序列化怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”spark kryo序列化怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
廣播大變量,每個executor可以對應一個blockmanager里面存著變量,雖然我們減少了網絡傳輸,減少了內存占用整體空間,但是還可以進一步減小網絡傳輸和內存占用空間,所以我們可以用kryo序列化機制!還可以進一步優化,優化這個序列化格式。
默認情況下,Spark內部是使用Java的序列化機制,ObjectOutputStream / ObjectInputStream,對象輸入輸出流機制,來進行序列化這種默認序列化機制的好處在于,處理起來比較方便;也不需要我們手動去做什么事情,只是,你在算子里面使用的變量,必須是實現Serializable接口的,可序列化即可。但是缺點在于,默認的序列化機制的效率不高,序列化的速度比較慢;序列化以后的數據,占用的內存空間相對還是比較大。
可以手動進行序列化格式的優化Spark支持使用Kryo序列化機制。Kryo序列化機制,比默認的Java序列化機制,速度要快,序列化后的數據要更小,大概是Java序列化機制的1/10。所以Kryo序列化優化以后,可以讓網絡傳輸的數據變少;在集群中耗費的內存資源大大減少。
Kryo序列化機制,一旦啟用以后,會生效的幾個地方:
算子函數中使用到的外部變量,肯定要傳輸的時候要序列化了
算子函數中使用到的外部變量,使用Kryo以后:優化網絡傳輸的性能,可以優化集群中內存的占用和消耗,算子函數中用到了外部變量,會序列化,使用Kryo
持久化RDD時進行序列化,StorageLevel.MEMORY_ONLY_SER
持久化RDD,優化內存的占用和消耗;持久化RDD占用的內存越少,task執行的時候,創建的對象,就不至于頻繁的占滿內存,頻繁發生GC。當使用了序列化的持久化級別時,在將每個RDD partition序列化成一個大的字節數組時,就會使用Kryo進一步優化序列化的效率和性能。
shuffle
shuffle:可以優化網絡傳輸的性能在進行stage間的task的shuffle操作時,節點與節點之間的task會互相大量通過網絡拉取和傳輸文件,此時,這些數據既然通過網絡傳輸,也是可能要序列化的,就會使用Kryo。
SparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
在SparkConf中設置一個屬性,spark.serializer,org.apache.spark.serializer.KryoSerializer類;
Kryo之所以沒有被作為默認的序列化類庫的原因,就要出現了:主要是因為Kryo要求,如果要達到它的最佳性能的話,那么就一定要注冊你自定義的類(比如,你的算子函數中使用到了外部自定義類型的對象變量,這時,就要求必須注冊你的類,否則Kryo達不到最佳性能)。感覺很麻煩,所以沒有默認。
注冊你使用到的,需要通過Kryo序列化的,一些自定義類,SparkConf.registerKryoClasses()
項目中的使用: .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .registerKryoClasses(new Class[]{CategorySortKey.class})
到此,關于“spark kryo序列化怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。