Spark On Yarn 資源申請流程
-
Client 模式
- 因?yàn)槭荂lient模式乾戏,所以當(dāng)我們 Spark-Submit 提交Spark任務(wù)的時(shí)候厌均,
會直接走到我們的main
方法肴焊,進(jìn)行Spark Context 的初始化,
那么客戶端也扮演著 Driver 角色 - Spark Context 初始化的時(shí)候會生成兩個(gè)比較重要的對象
DAGSchedule
和TaskSchedule
,
TaskSchedule
會進(jìn)行任務(wù)資源的申請矮固,因?yàn)槲覀冞@里是用 Yarn 作為資源調(diào)度器窿克,
所以TaskSchedule
會向 ResourceManager(RM) 進(jìn)行資源申請伪很。 - 接下來就是 Yarn 的資源調(diào)度了
- Yarn 首先會啟動一個(gè) ApplicationMaster(AM) 來管理本次申請搓萧,
所以 Yarn 的第一步是選一臺空閑的 NodeManager 啟動 AM - AM 啟動后杂数,會根據(jù)我們提交任務(wù)時(shí)申請的資源向 RM 進(jìn)行資源申請用來啟動 Container宛畦,
當(dāng)然這里用來處理的是Spark任務(wù),實(shí)際上啟動的是 Excutor. - 當(dāng)我們的Excutor 啟動之后揍移,他們會向Driver 端的 TaskSchedule 進(jìn)行注冊次和。
- 這個(gè)時(shí)候我們的 Spark Context 的初始化基本完成。接下來就是根據(jù)我們的代碼那伐,
生產(chǎn)Task 進(jìn)行任務(wù)調(diào)度了踏施。
如果不還是不太清楚各個(gè)角色的用途,可以參考下圖
- 因?yàn)槭荂lient模式乾戏,所以當(dāng)我們 Spark-Submit 提交Spark任務(wù)的時(shí)候厌均,
到這里我們也基本講明白了 Yarn-Client 模式的資源申請了罕邀,
但是說的比較淺畅形,沒有涉及到很多細(xì)節(jié),
說來也比較慚愧诉探,Spark 的 Standalone 模式源碼倒是看過日熬,
但是到目前為止,都沒有深入研究過Yarn的源碼肾胯,
盡管工作中基本都是用的 Yarn 作為資源管理~~~
所以也只能點(diǎn)到即止了竖席,如果后續(xù)有時(shí)間,可能會進(jìn)行補(bǔ)充敬肚。
-
Cluster 模式
看明白了Client模式毕荐,Cluster 模式就比較簡單了。
申請資源的流程基本都差不多艳馒,
區(qū)別就在于Driver程序所在的位置憎亚。- 因?yàn)槭荂luster模式,所以當(dāng)我們 Spark-Submit 提交Spark任務(wù)的時(shí)候弄慰,
首先是直接去向 RM 申請啟動Driver的資源 - Yarn 還是會首先選一臺空閑的 NodeManager 來啟動 AM管理本次申請第美,
不過在AM啟動的時(shí)候,AM也會對Spark Context 進(jìn)行初始化曹动,
所以在 Cluster 模式下斋日,AM 還扮演著另外一個(gè)角色,那就是 Driver墓陈。 - Driver啟動之后恶守,那就是開始申請 Excutor的資源了,所以AM 就開始向RM申請資源了贡必,
接下來的就和 Client 模式基本一致兔港,沒什么好說的
- 因?yàn)槭荂luster模式,所以當(dāng)我們 Spark-Submit 提交Spark任務(wù)的時(shí)候弄慰,
- Cluster 和 Client 的對比
-
Client 模式因?yàn)?Driver 是在提交的機(jī)器上面啟動的,
而我們也知道仔拟,Driver 在 Spark 任務(wù)運(yùn)行中是承當(dāng)著 任務(wù)調(diào)度 和 任務(wù)監(jiān)控的 任務(wù)的衫樊。
也就是說 Spark 在運(yùn)行過程中的所有信息都會向Driver 端進(jìn)行匯報(bào),
這也就造成了:- 當(dāng)在Client 端提交的任務(wù)過多,會導(dǎo)致 Client 這臺機(jī)器的負(fù)載變大科侈,
主要還是網(wǎng)卡容易成為瓶頸载佳,一旦出現(xiàn)這種問題,就會導(dǎo)致Driver 超時(shí)臀栈,
而Driver超時(shí)會使得任務(wù)直接就失敗蔫慧。所以生產(chǎn)環(huán)境是不建議這么玩的。 - 同樣因?yàn)镈river的存在权薯,其監(jiān)控Spark 任務(wù)的全過程姑躲,
其絕大部分日志信息都會向Driver匯總,很方便我們進(jìn)行調(diào)試盟蚣。
所以如果你的程序還在測試階段黍析,那么果斷用 Client模式吧,會方便很多屎开。
- 當(dāng)在Client 端提交的任務(wù)過多,會導(dǎo)致 Client 這臺機(jī)器的負(fù)載變大科侈,
Client 模式 因?yàn)槭荄river 的宿主阐枣,所以整個(gè)任務(wù)過程 Client的不能關(guān)閉的,
但是Cluster模式不一樣牍戚,當(dāng)任務(wù)提交后侮繁,
其實(shí)Client在不在已經(jīng)不影響任務(wù)的正常運(yùn)行了虑粥。