Spark的數(shù)據(jù)本地化和延遲調(diào)度策略

一.概述

Spark數(shù)據(jù)本地化即計(jì)算向數(shù)據(jù)移動(dòng)舒萎,但數(shù)據(jù)塊所在的Executor不一定有足夠的的計(jì)算資源提供登澜,為了讓task能盡可能的以最優(yōu)本地化級(jí)別(Locality Levels)來(lái)啟動(dòng)亦渗,Spark的延遲調(diào)度應(yīng)運(yùn)而生窟感,資源不夠可在該Locality Levels對(duì)應(yīng)的限制時(shí)間內(nèi)重試,超過(guò)限制時(shí)間后還無(wú)法啟動(dòng)則降低Locality Levels再嘗試啟動(dòng)薄翅。

二.本地化級(jí)別(Locality Levels)

Spark目前支持以下幾種本地化級(jí)別:

  • 1.PROCESS_LOCAL:進(jìn)程本地化,表示 task 要計(jì)算的數(shù)據(jù)在同一個(gè) Executor 中。
  • 2.NODE_LOCAL: 節(jié)點(diǎn)本地化皇忿,速度稍慢,因?yàn)閿?shù)據(jù)需要在不同的進(jìn)程之間傳遞或從文件中讀取坦仍。分為兩種情況鳍烁,第一種:task 要計(jì)算的數(shù)據(jù)是在同一個(gè) worker 的不同 Executor 進(jìn)程中。第二種:task 要計(jì)算的數(shù)據(jù)是在同一個(gè) worker 的磁盤上繁扎,或在 HDFS 上恰好有 block 在同一個(gè)節(jié)點(diǎn)上幔荒。如果 Spark 要計(jì)算的數(shù)據(jù)來(lái)源于 HDFS 上,那么最好的本地化級(jí)別就是 NODE_LOCAL梳玫。
  • 3.NO_PREF: 沒(méi)有最佳位置爹梁,數(shù)據(jù)從哪訪問(wèn)都一樣快,不需要位置優(yōu)先提澎。比如 Spark SQL 從 Mysql 中讀取數(shù)據(jù)姚垃。
  • 4.RACK_LOCAL:機(jī)架本地化,數(shù)據(jù)在同一機(jī)架的不同節(jié)點(diǎn)上虱朵。需要通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)以及文件 IO莉炉,比 NODE_LOCAL 慢钓账。
  • 5.ANY:跨機(jī)架,數(shù)據(jù)在非同一機(jī)架的網(wǎng)絡(luò)上絮宁,速度最慢梆暮。

三.Spark 的數(shù)據(jù)本地化由誰(shuí)來(lái)負(fù)責(zé)

DAGScheduler 切割Job,劃分Stage, 通過(guò)調(diào)用 submitStage 來(lái)提交一個(gè)Stage 對(duì)應(yīng)的 Tasks绍昂,submitStage 會(huì)調(diào)用 submitMissingTasks, submitMissingTasks 確定每個(gè)需要計(jì)算的 task 的preferredLocations啦粹,通過(guò)調(diào)用 getPreferrdeLocations方法得到 partition 的優(yōu)先位置,就是這個(gè) partition 對(duì)應(yīng)的 task 的優(yōu)先位置窘游,對(duì)于要提交到 TaskScheduler 的 TaskSet 中的每一個(gè)Task 唠椭,該 Task 優(yōu)先位置與其對(duì)應(yīng)的 partition 對(duì)應(yīng)的優(yōu)先位置一致。

TaskScheduler 接收到了 TaskSet 后忍饰,TaskScheduler會(huì)為每個(gè)TaskSet創(chuàng)建一個(gè)TaskSetMagager來(lái)對(duì)其Task進(jìn)行管理贪嫂,TaskSetMagager中包含TaskSet 所有 Task,并管理這些 Task 的執(zhí)行艾蓝,在初始化TaskSetMagager的時(shí)候就會(huì)通過(guò)computeValidLocalityLevels計(jì)算該TaskSet包含的Locality Levels力崇,以便在調(diào)度和延遲調(diào)度 tasks 時(shí)發(fā)揮作用。

總的來(lái)說(shuō)赢织,Spark 中的數(shù)據(jù)本地化是由 DAGScheduler 和 TaskScheduler 共同負(fù)責(zé)的亮靴。

四.Spark是如何進(jìn)行調(diào)度

Locality Levels表示了計(jì)算節(jié)點(diǎn)與輸入數(shù)據(jù)位置的關(guān)系,下面以一個(gè)圖來(lái)展開 Spark 是如何進(jìn)行調(diào)度的于置。這一個(gè)過(guò)程會(huì)涉及 RDD, DAGScheduler , TaskScheduler茧吊。

image

1.PROCESS_LOCAL
TaskScheduler 根據(jù)數(shù)據(jù)的位置向數(shù)據(jù)節(jié)點(diǎn)發(fā)送 Task 任務(wù)。如果這個(gè)任務(wù)在 worker1 的 Executor 中等待了 3 秒八毯。(默認(rèn)的搓侄,可以通過(guò)spark.locality.wait 來(lái)設(shè)置),可以通過(guò) SparkConf() 來(lái)修改宪彩,重試了 5 次之后休讳,還是無(wú)法執(zhí)行,TaskScheduler 就會(huì)降低數(shù)據(jù)本地化的級(jí)別尿孔,從 PROCESS_LOCAL 降到 NODE_LOCAL俊柔。

2.NODE_LOCAL
TaskScheduler 重新發(fā)送 task 到 worker1 中的 Executor2 中執(zhí)行,如果 Task 在worker1 的 Executor2 中等待了 3 秒活合,重試了 5 次雏婶,還是無(wú)法執(zhí)行,TaskScheduler 就會(huì)降低數(shù)據(jù)本地化的級(jí)別白指,從 NODE_LOCAL 降到 RACK_LOCAL留晚。

3.RACK_LOCAL
TaskScheduler重新發(fā)送 Task 到 worker2 中的 Executor1 中執(zhí)行。

4.獲取數(shù)據(jù)執(zhí)行
當(dāng) Task 分配完成之后告嘲,Task 會(huì)通過(guò)所在的 worker 的 Executor 中的 BlockManager 來(lái)獲取數(shù)據(jù)错维。如果 BlockManager 發(fā)現(xiàn)自己沒(méi)有數(shù)據(jù)奖地,那么它會(huì)調(diào)用 getRemoteValues 方法,通過(guò) BlockManagerSlaveEndpoint與Driver所在節(jié)點(diǎn)的BlockManagerMaster中的BlockManagerMasterEndpoint先建立連接赋焕,獲取數(shù)據(jù)所在的BlockManager的地址参歹,然后通過(guò)BlockTransferService(網(wǎng)絡(luò)傳輸組件)獲取數(shù)據(jù),通過(guò)網(wǎng)絡(luò)傳輸回Task所在節(jié)點(diǎn)(這時(shí)候性能大幅下降隆判,大量的網(wǎng)絡(luò)IO占用資源)犬庇,之后就開始計(jì)算流程。

四.優(yōu)化建議

TaskScheduler在發(fā)送 Task 的時(shí)候侨嘀,會(huì)根據(jù)數(shù)據(jù)所在的節(jié)點(diǎn)發(fā)送 Task 臭挽,這時(shí)候的數(shù)據(jù)本地化的級(jí)別是最高的,如果這個(gè) Task 在這個(gè)Executor中等待了3秒咬腕,重試發(fā)射了5次還是依然無(wú)法執(zhí)行欢峰,那么TaskScheduler就會(huì)認(rèn)為這個(gè)Executor的計(jì)算資源滿了,TaskScheduler會(huì)降低 1 級(jí)數(shù)據(jù)本地化的級(jí)別郎汪,重新發(fā)送 Task 到其他的Executor中執(zhí)行赤赊,如果還是依然無(wú)法執(zhí)行,那么繼續(xù)降低數(shù)據(jù)本地化的級(jí)別...

如果想讓每一個(gè) Task 都能拿到最好的數(shù)據(jù)本地化級(jí)別煞赢,那么調(diào)優(yōu)點(diǎn)就是等待時(shí)間加長(zhǎng)。注意哄孤!如果過(guò)度調(diào)大等待時(shí)間照筑,雖然為每一個(gè) Task 都拿到了最好的數(shù)據(jù)本地化級(jí)別,但是我們 Job 執(zhí)行的時(shí)間也會(huì)隨之延長(zhǎng)瘦陈。

屬性名稱 默認(rèn)值 含義
spark.locality.wait 3000 以下幾個(gè)參數(shù)是關(guān)于Spark數(shù)據(jù)本地性的凝危。本參數(shù)是以毫秒為單位啟動(dòng)本地?cái)?shù)據(jù)task的等待時(shí)間,如果超出就啟動(dòng)下一本地優(yōu)先級(jí)別的task晨逝。該設(shè)置同樣可以應(yīng)用到各優(yōu)先級(jí)別的本地性之間(本地進(jìn)程 -> 本地節(jié)點(diǎn) -> 本地機(jī)架 -> 任意節(jié)點(diǎn) )蛾默,當(dāng)然,也可以通過(guò)spark.locality.wait.node等參數(shù)設(shè)置不同優(yōu)先級(jí)別的本地性
spark.locality.wait.process spark.locality.wait 本地進(jìn)程級(jí)別的本地等待時(shí)間
spark.locality.wait.node spark.locality.wait 本地節(jié)點(diǎn)級(jí)別的本地等待時(shí)間
spark.locality.wait.rack spark.locality.wait 本地機(jī)架級(jí)別的本地等待時(shí)間

可以在代碼里面這樣設(shè)置:

new SparkConf.set("spark.locality.wait","1000")

五.參考資料

1.Spark 的 數(shù)據(jù)本地化捉貌,提供最佳的計(jì)算節(jié)點(diǎn)支鸡,終于入門了
2.Spark性能調(diào)優(yōu)篇六之調(diào)節(jié)數(shù)據(jù)本地化等待時(shí)長(zhǎng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市趁窃,隨后出現(xiàn)的幾起案子牧挣,更是在濱河造成了極大的恐慌,老刑警劉巖醒陆,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瀑构,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡刨摩,警方通過(guò)查閱死者的電腦和手機(jī)寺晌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門世吨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人呻征,你說(shuō)我怎么就攤上這事另假。” “怎么了怕犁?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵边篮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我奏甫,道長(zhǎng)戈轿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任阵子,我火速辦了婚禮思杯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挠进。我一直安慰自己色乾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布领突。 她就那樣靜靜地躺著暖璧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪君旦。 梳的紋絲不亂的頭發(fā)上澎办,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音金砍,去河邊找鬼局蚀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛恕稠,可吹牛的內(nèi)容都是我干的琅绅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鹅巍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼千扶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起昆著,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤县貌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凑懂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煤痕,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摆碉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塘匣。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巷帝,靈堂內(nèi)的尸體忽然破棺而出忌卤,到底是詐尸還是另有隱情,我是刑警寧澤楞泼,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布驰徊,位于F島的核電站,受9級(jí)特大地震影響堕阔,放射性物質(zhì)發(fā)生泄漏棍厂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一超陆、第九天 我趴在偏房一處隱蔽的房頂上張望牺弹。 院中可真熱鬧,春花似錦时呀、人聲如沸张漂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)航攒。三九已至,卻和暖如春瞧预,著一層夾襖步出監(jiān)牢的瞬間屎债,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工垢油, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圆丹。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓滩愁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辫封。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硝枉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

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