Spark運(yùn)行原理
構(gòu)建應(yīng)用程序運(yùn)行時(shí)
首先根據(jù)應(yīng)用程序資源需求構(gòu)建一個(gè)運(yùn)行時(shí)環(huán)境弊决,通過與資源管理器交互來完成周伦,通常存在兩種方式:
粗粒度宫莱,應(yīng)用程序在提交之后只酥,正式運(yùn)行之前根據(jù)程序資源需求一次性獲取資源,整個(gè)運(yùn)行過程不再申請(qǐng)新的資源
細(xì)粒度遍希,應(yīng)用程序在提交之后等曼,動(dòng)態(tài)向集群申請(qǐng)資源,只要等資源滿足一個(gè)任務(wù)的運(yùn)行就開始執(zhí)行凿蒜,基于Hadoop的MR就是基于細(xì)粒度運(yùn)行時(shí)構(gòu)建
對(duì)于Spark on YARN禁谦,目前支持粗力度
應(yīng)用程序轉(zhuǎn)換成DAG
根據(jù)寬依賴和窄依賴拆分Stage,將應(yīng)用程序轉(zhuǎn)換成DAG
首先废封,從數(shù)據(jù)混洗的角度州泊,窄依賴RDD可以通過相同鍵進(jìn)行聯(lián)合分區(qū),整個(gè)操作可以在同一個(gè)節(jié)點(diǎn)上流水線式運(yùn)行漂洋,不會(huì)造成網(wǎng)絡(luò)間數(shù)據(jù)傳輸
其次遥皂,從失敗恢復(fù)的角度,窄依賴的失敗只需要重新計(jì)算丟失的RDD的父分區(qū)刽漂,并且可以在不同節(jié)點(diǎn)并行計(jì)算演训。寬依賴會(huì)設(shè)計(jì)多個(gè)父RDD分區(qū)的重新計(jì)算
首先將DAG劃分成一個(gè)完整的Stage,從最后一個(gè)RDD往前回溯贝咙,不斷判斷RDD的依賴關(guān)系样悟,如果是窄依賴則繼續(xù)回溯,寬依賴則劃分出一個(gè)新的Stage
調(diào)度執(zhí)行DAG
DAGScheduler按照依賴關(guān)系調(diào)度執(zhí)行每個(gè)Stage庭猩,優(yōu)先選擇不依賴任何階段的Stage窟她。執(zhí)行Stage階段啟動(dòng)一定數(shù)目的Task并行執(zhí)行
Spark的優(yōu)化機(jī)制(借鑒MapReduce)
數(shù)據(jù)本地性,對(duì)任務(wù)進(jìn)行調(diào)度時(shí)蔼水,為算子選擇節(jié)點(diǎn)震糖,優(yōu)先選擇數(shù)據(jù)所在節(jié)點(diǎn),其次選擇數(shù)據(jù)所在機(jī)架節(jié)點(diǎn)徙缴,最后選擇其他機(jī)架節(jié)點(diǎn)试伙。
推測(cè)執(zhí)行嘁信,檢查到同類任務(wù)存在明顯比較慢的任務(wù)時(shí)于样,嘗試為慢任務(wù)啟動(dòng)備份任務(wù),先完成的結(jié)果作為最終結(jié)果潘靖。
多線程執(zhí)行具體的任務(wù)穿剖,減少多進(jìn)程任務(wù)的啟動(dòng)開銷
Executor上有一個(gè)BlockManager存儲(chǔ)模塊,當(dāng)需要多輪迭代時(shí)卦溢,將中間過程的數(shù)據(jù)進(jìn)行存儲(chǔ)糊余,后續(xù)需要時(shí)直接讀取存儲(chǔ)數(shù)據(jù)秀又。