Spark Shuffle 模塊② - Hash Based Shuffle write

Spark 2.0 中已經(jīng)移除 Hash Based Shuffle,但作為曾經(jīng)的默認 Shuffle 機制竿裂,還是值得進行分析

Spark 最開始只有 Hash Based Shuffle纵苛,因為在很多場景中并不需要排序剿涮,在這些場景中多余的排序反而會損耗性能。

Hash Based Shuffle Write

該過程實現(xiàn)的核心是在 HashShuffleWriter#write(records: Iterator[Product2[K, V]]): Unit 其主要流程如下:

該函數(shù)的輸入是一個 Shuffle Map Task 計算得到的結(jié)果(對應(yīng)的迭代器)攻人,若在寬依賴中定義了 map 端的聚合則會先進行聚合取试,隨后對于迭代器(若要聚合則為聚合后的迭代器)的每一項先通過計算 key 的 hash 值來確定要寫到哪個文件,然后將 key怀吻、value 寫入文件瞬浓。

寫入的文件名的格式是:shuffle_$shuffleId_$mapId_$reduceId。寫入時蓬坡,若文件已存在會刪除會創(chuàng)建新文件猿棉。

上圖描述了如何處理一個 Shuffle Map Task 計算結(jié)果,在實際應(yīng)用中屑咳,往往有很多 Shuffle Map Tasks 及下游 tasks萨赁,即如下情況(圖摘自:JerryLead/SparkInternals-Shuffle 過程):

存在的問題

這種簡單的實現(xiàn)會有幾個問題,為說明方便兆龙,這里設(shè) M = Shuffle Map Task 數(shù)量杖爽,R = 下游 tasks 數(shù)量

  • 產(chǎn)生過多文件:由于每個 Shuffle Map Task 需要為每個下游的 Task 創(chuàng)建一個單獨的文件,因此文件的數(shù)量就是 M * R紫皇。如果 Shuffle Map Tasks 數(shù)量是 1000慰安,下游的 tasks 數(shù)是 800,那么理論上會產(chǎn)生 80w 個文件(對于 size 為 0的文件會特殊處理)
  • 打開多個文件對于系統(tǒng)來說意味著隨機寫聪铺,尤其是每個文件較小且文件特別多的情況化焕。機械硬盤在隨機讀寫方面的性能很差,如果是固態(tài)硬盤铃剔,會改善很多
  • 緩沖區(qū)占用內(nèi)存空間大:每個 Shuffle Map Task 需要開 R 個 bucket(為減少寫文件次數(shù)的緩沖區(qū))撒桨,N 個 Shuffle Map Task 就會產(chǎn)生 N * R 個 bucket脂倦。雖然一個 Shuffle Map Task,對應(yīng)的 buckets 會被回收元莫,但一個節(jié)點上的 bucket 個數(shù)最多可以達到 cores * R 個赖阻,每個 bucket 默認為 32KB。對于 24 核 1000 個 reducer 來說踱蠢,占用內(nèi)存就是 750MB

改進:Shuffle Consolidate Writer

在上面提到的幾個問題火欧,Spark 提供了 Shuffle Consolidate Files 機制進行優(yōu)化。該機制的手段是減少 Shuffle 過程產(chǎn)生的文件茎截,若使用這個功能苇侵,則需要置 spark.shuffle.consolidateFilestrue,其實現(xiàn)可用下圖來表示(圖摘自:JerryLead/SparkInternals-Shuffle 過程

即:對于運行在同一個 core 的 Shuffle Map Tasks企锌,對于將要被同一個 reducer read 的數(shù)據(jù)榆浓,第一個 Shuffle Map Task 會創(chuàng)建一個文件,之后的就會將數(shù)據(jù)追加到這個文件而不是新建一個文件(相當于同一個 core 上的 Shuffle Map Task 寫了文件不同的部分)撕攒。因此文件數(shù)就從原來的 M * R 個變成了 cores * R 個陡鹃。當 M / cores 的值越大,減少文件數(shù)的效果越顯著抖坪。需要注意的是萍鲸,該機制雖然在很多時候能緩解上述的幾個問題,但是并不能徹底解決擦俐。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脊阴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚯瞧,更是在濱河造成了極大的恐慌嘿期,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埋合,死亡現(xiàn)場離奇詭異备徐,居然都是意外死亡,警方通過查閱死者的電腦和手機饥悴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門坦喘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盲再,“玉大人西设,你說我怎么就攤上這事〈鹋螅” “怎么了贷揽?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長梦碗。 經(jīng)常有香客問我禽绪,道長蓖救,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任印屁,我火速辦了婚禮循捺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雄人。我一直安慰自己从橘,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布础钠。 她就那樣靜靜地躺著恰力,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旗吁。 梳的紋絲不亂的頭發(fā)上踩萎,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音很钓,去河邊找鬼香府。 笑死,一個胖子當著我的面吹牛码倦,可吹牛的內(nèi)容都是我干的回还。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叹洲,長吁一口氣:“原來是場噩夢啊……” “哼柠硕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起运提,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蝗柔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后民泵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癣丧,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年栈妆,在試婚紗的時候發(fā)現(xiàn)自己被綠了胁编。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳞尔,死狀恐怖嬉橙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寥假,我是刑警寧澤市框,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站糕韧,受9級特大地震影響枫振,放射性物質(zhì)發(fā)生泄漏喻圃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一粪滤、第九天 我趴在偏房一處隱蔽的房頂上張望斧拍。 院中可真熱鬧,春花似錦杖小、人聲如沸饮焦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽县踢。三九已至,卻和暖如春伟件,著一層夾襖步出監(jiān)牢的瞬間硼啤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工斧账, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谴返,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓咧织,卻偏偏與公主長得像嗓袱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子习绢,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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