Spark Shuffle之Hash Shuffle

源文件放在github严沥,如有謬誤之處,歡迎指正中姜。原文鏈接https://github.com/jacksu/utils4s/blob/master/spark-knowledge/md/hash-shuffle.md

正如你所知消玄,spark實(shí)現(xiàn)了多種shuffle方法,通過(guò) spark.shuffle.manager來(lái)確定丢胚。暫時(shí)總共有三種:hash shuffle翩瓜、sort shuffle和tungsten-sort shuffle,從1.2.0開(kāi)始默認(rèn)為sort shuffle携龟。本節(jié)主要介紹hash shuffle兔跌。

spark在1.2前默認(rèn)為hash shuffle(spark.shuffle.manager = hash),但hash shuffle也經(jīng)歷了兩個(gè)發(fā)展階段峡蟋。

第一階段

上圖有 4 個(gè) ShuffleMapTask 要在同一個(gè) worker node 上運(yùn)行坟桅,CPU core 數(shù)為 2,可以同時(shí)運(yùn)行兩個(gè) task蕊蝗。每個(gè) task 的執(zhí)行結(jié)果(該 stage 的 finalRDD 中某個(gè) partition 包含的 records)被逐一寫(xiě)到本地磁盤(pán)上仅乓。每個(gè) task 包含 R 個(gè)緩沖區(qū),R = reducer 個(gè)數(shù)(也就是下一個(gè) stage 中 task 的個(gè)數(shù))蓬戚,緩沖區(qū)被稱(chēng)為 bucket夸楣,其大小為spark.shuffle.file.buffer.kb ,默認(rèn)是 32KB(Spark 1.1 版本以前是 100KB)。

第二階段

這樣的實(shí)現(xiàn)很簡(jiǎn)單裕偿,但有幾個(gè)問(wèn)題:

1 產(chǎn)生的 FileSegment 過(guò)多洞慎。每個(gè) ShuffleMapTask 產(chǎn)生 R(reducer 個(gè)數(shù))個(gè) FileSegment,M 個(gè) ShuffleMapTask 就會(huì)產(chǎn)生 M * R 個(gè)文件嘿棘。一般 Spark job 的 M 和 R 都很大,因此磁盤(pán)上會(huì)存在大量的數(shù)據(jù)文件旭绒。

2 緩沖區(qū)占用內(nèi)存空間大鸟妙。每個(gè) ShuffleMapTask 需要開(kāi) R 個(gè) bucket,M 個(gè) ShuffleMapTask 就會(huì)產(chǎn)生 M * R 個(gè) bucket挥吵。雖然一個(gè) ShuffleMapTask 結(jié)束后重父,對(duì)應(yīng)的緩沖區(qū)可以被回收,但一個(gè) worker node 上同時(shí)存在的 bucket 個(gè)數(shù)可以達(dá)到 cores R 個(gè)(一般 worker 同時(shí)可以運(yùn)行 cores 個(gè) ShuffleMapTask)忽匈,占用的內(nèi)存空間也就達(dá)到了cores * R * 32 KB房午。對(duì)于 8 核 1000 個(gè) reducer 來(lái)說(shuō),占用內(nèi)存就是 256MB丹允。

spark.shuffle.consolidateFiles默認(rèn)為false郭厌,如果為true,shuffleMapTask輸出文件可以被合并雕蔽。如圖

可以明顯看出折柠,在一個(gè) core 上連續(xù)執(zhí)行的 ShuffleMapTasks 可以共用一個(gè)輸出文件 ShuffleFile。先執(zhí)行完的 ShuffleMapTask 形成 ShuffleBlock i批狐,后執(zhí)行的 ShuffleMapTask 可以將輸出數(shù)據(jù)直接追加到 ShuffleBlock i 后面扇售,形成 ShuffleBlock i',每個(gè) ShuffleBlock 被稱(chēng)為 FileSegment嚣艇。下一個(gè) stage 的 reducer 只需要 fetch 整個(gè) ShuffleFile 就行了承冰。這樣,每個(gè) worker 持有的文件數(shù)降為 cores * R食零。但是緩存空間占用大還沒(méi)有解決困乒。

總結(jié)

優(yōu)點(diǎn)

  1. 快-不需要排序,也不需要維持hash表
  2. 不需要額外空間用作排序
  3. 不需要額外IO-數(shù)據(jù)寫(xiě)入磁盤(pán)只需一次慌洪,讀取也只需一次

缺點(diǎn)

  1. 當(dāng)partitions大時(shí)顶燕,輸出大量的文件(cores * R),性能開(kāi)始降低
  2. 大量的文件寫(xiě)入,使文件系統(tǒng)開(kāi)始變?yōu)殡S機(jī)寫(xiě)冈爹,性能比順序?qū)懸档?00倍
  3. 緩存空間占用比較大

當(dāng)然涌攻,數(shù)據(jù)經(jīng)過(guò)序列化、壓縮寫(xiě)入文件频伤,讀取的時(shí)候恳谎,需要反序列化、解壓縮。reduce fetch的時(shí)候有一個(gè)非常重要的參數(shù)spark.reducer.maxSizeInFlight因痛,這里用 softBuffer 表示婚苹,默認(rèn)大小為 48MB。一個(gè) softBuffer 里面一般包含多個(gè) FileSegment鸵膏,但如果某個(gè) FileSegment 特別大的話膊升,這一個(gè)就可以填滿甚至超過(guò) softBuffer 的界限。如果增大谭企,reduce請(qǐng)求的chunk就會(huì)變大廓译,可以提高性能,但是增加了reduce的內(nèi)存使用量债查。

如果排序在reduce不強(qiáng)制執(zhí)行非区,那么reduce只返回一個(gè)依賴(lài)于map的迭代器。如果需要排序盹廷, 那么在reduce端征绸,調(diào)用ExternalSorter

參考文獻(xiàn)

spark Architecture:Shuffle

shuffle 過(guò)程

sort shuffle

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俄占,一起剝皮案震驚了整個(gè)濱河市管怠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颠放,老刑警劉巖排惨,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碰凶,居然都是意外死亡暮芭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)欲低,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辕宏,“玉大人,你說(shuō)我怎么就攤上這事砾莱∪鹂穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵腊瑟,是天一觀的道長(zhǎng)聚假。 經(jīng)常有香客問(wèn)我,道長(zhǎng)闰非,這世上最難降的妖魔是什么膘格? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮财松,結(jié)果婚禮上瘪贱,老公的妹妹穿的比我還像新娘纱控。我一直安慰自己,他們只是感情好菜秦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布甜害。 她就那樣靜靜地躺著,像睡著了一般球昨。 火紅的嫁衣襯著肌膚如雪尔店。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天褪尝,我揣著相機(jī)與錄音闹获,去河邊找鬼。 笑死河哑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的龟虎。 我是一名探鬼主播璃谨,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鲤妥!你這毒婦竟也來(lái)了佳吞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棉安,失蹤者是張志新(化名)和其女友劉穎底扳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贡耽,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衷模,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒲赂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱冶。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滥嘴,靈堂內(nèi)的尸體忽然破棺而出木蹬,到底是詐尸還是另有隱情,我是刑警寧澤若皱,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布镊叁,位于F島的核電站,受9級(jí)特大地震影響走触,放射性物質(zhì)發(fā)生泄漏晦譬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一饺汹、第九天 我趴在偏房一處隱蔽的房頂上張望蛔添。 院中可真熱鬧,春花似錦、人聲如沸迎瞧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凶硅。三九已至缝裁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間足绅,已是汗流浹背捷绑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氢妈,地道東北人粹污。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像首量,于是被迫代替她去往敵國(guó)和親壮吩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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