Spark性能優(yōu)化之如何使用廣播變量以及Kryo序列化

廣播變量

在Spark Application中,經(jīng)常會(huì)使用到一個(gè)共享變量,眾所周知的芯砸,Spark是一個(gè)并行計(jì)算框架,對(duì)于這個(gè)變量给梅,每一個(gè)executor的task在訪(fǎng)問(wèn)它的時(shí)候假丧,都會(huì)去拷貝一份副本去使用。如下圖所示:

對(duì)于這種默認(rèn)方式动羽,它會(huì)極大的系統(tǒng)的內(nèi)存包帚,我們可以假設(shè)一個(gè)集群中有1024個(gè)task,這個(gè)共享變量大小假設(shè)為1M运吓,那么就會(huì)去復(fù)制1024份到集群上去渴邦,這樣就會(huì)有1個(gè)G的數(shù)據(jù)在網(wǎng)絡(luò)中傳輸,并且系統(tǒng)需要耗費(fèi)1G內(nèi)存去為這些副本分配空間拘哨,這樣對(duì)于系統(tǒng)有什么影響呢谋梭?

如果系統(tǒng)內(nèi)存不足,RDD持久化的時(shí)候無(wú)法在內(nèi)存中持久化倦青,需要持久化到磁盤(pán)中瓮床,那么后續(xù)的操作會(huì)因?yàn)轭l繁的磁盤(pán)IO使得速度變慢,性能下降。
當(dāng)task中創(chuàng)建對(duì)象時(shí)隘庄,發(fā)現(xiàn)堆中內(nèi)存不足踢步,那么就需要進(jìn)行GC操作,進(jìn)行GC的時(shí)候峭沦,會(huì)導(dǎo)致工作線(xiàn)程暫停贾虽,如果內(nèi)存嚴(yán)重不足,頻繁的GC對(duì)于Spark作業(yè)的速度的影響是可想而知的吼鱼。
對(duì)于以上問(wèn)題蓬豁,我們?cè)撛趺催M(jìn)行性能優(yōu)化呢?

這時(shí)菇肃,我們可以使用Broadcast地粪,將這種每個(gè)task需要用到的共享變量廣播出去。

從上面的圖中可以看到琐谤,當(dāng)每一個(gè)task需要使用這個(gè)變量的時(shí)候都會(huì)拷貝一份蟆技。如果使用廣播變量,首先該廣播變量會(huì)拷貝一份副本到Driver中斗忌,當(dāng)每一個(gè)executor的task使用到該變量時(shí)质礼,首先會(huì)去每個(gè)executor的BlockManager中去檢查是否有該變量的副本,如果沒(méi)有织阳,接著會(huì)去Driver中去拷貝一份副本到BlockManager中眶蕉,然后供該executor中的每一個(gè)task使用,到下一個(gè)executor的task需要使用這個(gè)變量時(shí)唧躲,它的BlockManager可以去Driver中拷貝副本造挽,也可以去距離比較近的executor的BlockManager中去拷貝。(每一個(gè)executor中的BlockManager的作用是負(fù)責(zé)管理每一個(gè)executor對(duì)應(yīng)的內(nèi)存和磁盤(pán)的數(shù)據(jù)弄痹。)其原理圖如上所示:

在默認(rèn)情況下饭入,如果是1024個(gè)task需要消耗1G內(nèi)存,但是如果我們有50個(gè)executor來(lái)平分這些task肛真,那么只需要50個(gè)副本即可谐丢,總共消耗了50M內(nèi)存,那么在內(nèi)存的消耗了節(jié)省了大約20倍蚓让。而且副本的復(fù)制有時(shí)不需要從Driver拷貝乾忱,而是從其他executor中拷貝,那么凭疮,網(wǎng)絡(luò) 傳輸帶來(lái)的性能消耗也會(huì)小很多,可想而知串述,使用廣播變量可以節(jié)省很多內(nèi)存执解,從而使得性能顯著提升。

如何使用廣播變量呢?

比如我們的共享變量是一個(gè)map類(lèi)型的變量衰腌,我們可以使用Spark上下文來(lái)創(chuàng)建廣播變量:

Broadcast<Map<String>> broadcast=sc.broadcast(map);

在task中使用的時(shí)候可以使用value方法或者getValue方法來(lái)獲取它的值:

Map<String> map=broadcast.value;

Kryo序列化

在上面通過(guò)廣播變量降低網(wǎng)絡(luò)傳輸壓力以及節(jié)省了不少內(nèi)存之后新蟆,我們可以再進(jìn)一步的優(yōu)化,序列化是一種不錯(cuò)的選擇右蕊,可以減少數(shù)據(jù)占用的內(nèi)存大小琼稻。

默認(rèn)的Spark使用的是java序列化機(jī)制,即通過(guò)ObjectOutputStream / ObjectInputStream饶囚,對(duì)象輸入輸出流機(jī)制帕翻,來(lái)進(jìn)行序列化。

使用默認(rèn)的這種序列化機(jī)制萝风,好處在于簡(jiǎn)單方便嘀掸,不需要你自己進(jìn)行任何配置,只需要在需要序列化的類(lèi)上實(shí)現(xiàn)Serializable接口规惰;缺點(diǎn)在于序列化的效率不高睬塌,序列化的速度比較低,序列化之后的數(shù)據(jù)占用空間依舊很大歇万。因此揩晴,我們?cè)诒匾獣r(shí)可以手動(dòng)指定序列化方式進(jìn)行優(yōu)化。

Spark支持Kryo序列化機(jī)制贪磺,Kryo序列化機(jī)制硫兰,比默認(rèn)的Java序列化機(jī)制,速度要快缘挽,序列化后的數(shù)據(jù)要更小瞄崇,大概是Java序列化機(jī)制的1/10。

因此壕曼,使用Kryo序列化機(jī)制可以讓 網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)更小苏研,而且在集群中耗費(fèi)的內(nèi)存也大大減少。

Kryo序列化作用的地方

Kryo序列化一旦啟用腮郊,在以下幾個(gè)地方將會(huì)生效:

算子函數(shù)中使用的外部變量摹蘑。算子函數(shù)中使用到的外部變量,使用Kryo以后轧飞,優(yōu)化網(wǎng)絡(luò)傳輸?shù)男阅苄坡梗梢詢(xún)?yōu)化集群中內(nèi)存的占用和消耗
持久化RDD時(shí)進(jìn)行序列化,比如StorageLevel.MEMORY_ONLY_SER过咬。持久化RDD大渤,優(yōu)化內(nèi)存的占用和消耗;持久化RDD占用的內(nèi)存越少掸绞,task執(zhí)行的時(shí)候泵三,創(chuàng)建的對(duì)象,就不至于頻繁的占滿(mǎn)內(nèi)存,頻繁發(fā)生GC烫幕。
shuffle時(shí)進(jìn)行序列化俺抽,可以?xún)?yōu)化網(wǎng)絡(luò)傳輸?shù)男阅堋?br> 如何使用Kryo序列化

第一步:在SparkConf中設(shè)置序列化屬性spark.serializer,值為org.apache.spark.serializer.KryoSerializer较曼。

第二步:注冊(cè)你需要使用Kryo序列化的一些自定義類(lèi)磷斧,使用SparkConf.registerKryoClasses()
方法進(jìn)行注冊(cè)。

例如:

new SparkConf()
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.registerKryoClasses(new Class[]{CategorySortKey.class})

使用廣播變量和序列化很簡(jiǎn)單捷犹,但是我們不能忽視它對(duì)于系統(tǒng)性能的影響弛饭,也許一個(gè)小小的修改就能對(duì)系統(tǒng)的性能提升很多倍,這也是我們性能優(yōu)化的重點(diǎn)伏恐,不能忽略每一個(gè)細(xì)節(jié)孩哑,一昧的去追去高大上的優(yōu)化技巧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翠桦,一起剝皮案震驚了整個(gè)濱河市横蜒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌销凑,老刑警劉巖丛晌,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異斗幼,居然都是意外死亡澎蛛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)蜕窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谋逻,“玉大人,你說(shuō)我怎么就攤上這事桐经』僬祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵阴挣,是天一觀的道長(zhǎng)气堕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)畔咧,這世上最難降的妖魔是什么茎芭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮誓沸,結(jié)果婚禮上梅桩,老公的妹妹穿的比我還像新娘。我一直安慰自己拜隧,他們只是感情好宿百,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布煮寡。 她就那樣靜靜地躺著,像睡著了一般犀呼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薇组,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天外臂,我揣著相機(jī)與錄音,去河邊找鬼律胀。 笑死宋光,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炭菌。 我是一名探鬼主播罪佳,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黑低!你這毒婦竟也來(lái)了赘艳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤克握,失蹤者是張志新(化名)和其女友劉穎蕾管,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菩暗,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掰曾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邪铲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疤剑。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庸诱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秒梅,到底是詐尸還是另有隱情,我是刑警寧澤讶坯,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布番电,位于F島的核電站,受9級(jí)特大地震影響辆琅,放射性物質(zhì)發(fā)生泄漏漱办。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一婉烟、第九天 我趴在偏房一處隱蔽的房頂上張望娩井。 院中可真熱鬧,春花似錦似袁、人聲如沸洞辣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扬霜。三九已至定鸟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間著瓶,已是汗流浹背联予。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留材原,地道東北人沸久。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像余蟹,于是被迫代替她去往敵國(guó)和親卷胯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.1威酒、 分配更多資源 1.1.1窑睁、分配哪些資源? Executor的數(shù)量 每個(gè)Executor所能分配的CPU數(shù)...
    miss幸運(yùn)閱讀 3,176評(píng)論 3 15
  • 前言 在大數(shù)據(jù)計(jì)算領(lǐng)域葵孤,Spark已經(jīng)成為了越來(lái)越流行卵慰、越來(lái)越受歡迎的計(jì)算平臺(tái)之一。Spark的功能涵蓋了大數(shù)據(jù)領(lǐng)...
    Alukar閱讀 552評(píng)論 0 6
  • 原文:https://tech.meituan.com/spark-tuning-basic.html Spark...
    code_solve閱讀 1,211評(píng)論 0 10
  • 1 前言 在大數(shù)據(jù)計(jì)算領(lǐng)域佛呻,Spark已經(jīng)成為了越來(lái)越流行裳朋、越來(lái)越受歡迎的計(jì)算平臺(tái)之一。Spark的功能涵蓋了大數(shù)...
    wisfern閱讀 2,434評(píng)論 3 39
  • 四周吓著,樹(shù)木環(huán)繞 或彼此親近鲤嫡,或彼此心懷鬼胎 有的高聳入云 有的在低處茍延殘喘 沒(méi)有脊梁的藤科植物 攀援著扭曲向上 ...
    冷冬年閱讀 4,280評(píng)論 137 154