溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spark kryo序列化怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-16 15:00:26 來源:億速云 閱讀:122 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“spark kryo序列化怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在spark kryo序列化怎么實(shí)現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”spark kryo序列化怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

        廣播大變量,每個(gè)executor可以對應(yīng)一個(gè)blockmanager里面存著變量,雖然我們減少了網(wǎng)絡(luò)傳輸,減少了內(nèi)存占用整體空間,但是還可以進(jìn)一步減小網(wǎng)絡(luò)傳輸和內(nèi)存占用空間,所以我們可以用kryo序列化機(jī)制!還可以進(jìn)一步優(yōu)化,優(yōu)化這個(gè)序列化格式。

        默認(rèn)情況下,Spark內(nèi)部是使用Java的序列化機(jī)制,ObjectOutputStream / ObjectInputStream,對象輸入輸出流機(jī)制,來進(jìn)行序列化這種默認(rèn)序列化機(jī)制的好處在于,處理起來比較方便;也不需要我們手動去做什么事情,只是,你在算子里面使用的變量,必須是實(shí)現(xiàn)Serializable接口的,可序列化即可。但是缺點(diǎn)在于,默認(rèn)的序列化機(jī)制的效率不高,序列化的速度比較慢;序列化以后的數(shù)據(jù),占用的內(nèi)存空間相對還是比較大。

        可以手動進(jìn)行序列化格式的優(yōu)化Spark支持使用Kryo序列化機(jī)制。Kryo序列化機(jī)制,比默認(rèn)的Java序列化機(jī)制,速度要快,序列化后的數(shù)據(jù)要更小,大概是Java序列化機(jī)制的1/10。所以Kryo序列化優(yōu)化以后,可以讓網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)變少;在集群中耗費(fèi)的內(nèi)存資源大大減少。

Kryo序列化機(jī)制,一旦啟用以后,會生效的幾個(gè)地方:

  • 算子函數(shù)中使用到的外部變量,肯定要傳輸?shù)臅r(shí)候要序列化了

    • 算子函數(shù)中使用到的外部變量,使用Kryo以后:優(yōu)化網(wǎng)絡(luò)傳輸?shù)男阅埽梢詢?yōu)化集群中內(nèi)存的占用和消耗,算子函數(shù)中用到了外部變量,會序列化,使用Kryo

  • 持久化RDD時(shí)進(jìn)行序列化,StorageLevel.MEMORY_ONLY_SER

    • 持久化RDD,優(yōu)化內(nèi)存的占用和消耗;持久化RDD占用的內(nèi)存越少,task執(zhí)行的時(shí)候,創(chuàng)建的對象,就不至于頻繁的占滿內(nèi)存,頻繁發(fā)生GC。當(dāng)使用了序列化的持久化級別時(shí),在將每個(gè)RDD partition序列化成一個(gè)大的字節(jié)數(shù)組時(shí),就會使用Kryo進(jìn)一步優(yōu)化序列化的效率和性能。

  • shuffle

    • shuffle:可以優(yōu)化網(wǎng)絡(luò)傳輸?shù)男阅茉谶M(jìn)行stage間的task的shuffle操作時(shí),節(jié)點(diǎn)與節(jié)點(diǎn)之間的task會互相大量通過網(wǎng)絡(luò)拉取和傳輸文件,此時(shí),這些數(shù)據(jù)既然通過網(wǎng)絡(luò)傳輸,也是可能要序列化的,就會使用Kryo。

      SparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")


  1. 在SparkConf中設(shè)置一個(gè)屬性,spark.serializer,org.apache.spark.serializer.KryoSerializer類;

  • Kryo之所以沒有被作為默認(rèn)的序列化類庫的原因,就要出現(xiàn)了:主要是因?yàn)镵ryo要求,如果要達(dá)到它的最佳性能的話,那么就一定要注冊你自定義的類(比如,你的算子函數(shù)中使用到了外部自定義類型的對象變量,這時(shí),就要求必須注冊你的類,否則Kryo達(dá)不到最佳性能)。感覺很麻煩,所以沒有默認(rèn)。

  • 注冊你使用到的,需要通過Kryo序列化的,一些自定義類,SparkConf.registerKryoClasses()

    項(xiàng)目中的使用:
    .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    .registerKryoClasses(new Class[]{CategorySortKey.class})

到此,關(guān)于“spark kryo序列化怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI