????????上一篇我們闡述了Driver,Application,Worker的注冊(cè)實(shí)現(xiàn)原理,本篇我們來接著聊聊Driver,Application在注冊(cè)之后是如何實(shí)現(xiàn)調(diào)度的。廢話不多說,直接上源碼進(jìn)行分析(本篇所述內(nèi)容比較重要,請(qǐng)耐心看完)。
我們來分析一下上面這段代碼:
1.首先過濾出 所有的worker進(jìn)行過濾操作,獲得所有正常工作的worker,然后將其進(jìn)行shuffle操作;
2.遍歷等待調(diào)度的Driver,判斷當(dāng)前的Driver是否可以被啟動(dòng)并且是否有可用的worker;
3.如果滿足當(dāng)前的worker的內(nèi)存大于等于要啟動(dòng)的driver的內(nèi)存并且該worker的CPU和核數(shù)大于等于要啟動(dòng)driver需要的CPU核數(shù),調(diào)用launchDriver在worker上啟動(dòng)Driver;
4.launchDriver方法會(huì)向worker發(fā)送一個(gè)啟動(dòng)Driver的信號(hào),然后將driver的狀態(tài)置為RUNNING;
分析完Driver的scheduler機(jī)制后,我們來看看Application適合調(diào)度的,Application的調(diào)度有兩種方式,如上圖所示,其實(shí)說白了就是一種是平均分配策略和非平均分配策略,現(xiàn)在來分析一下源碼是如何實(shí)現(xiàn)的;
基于平均分配算法:
1.遍歷需要調(diào)度的Application,且該Application還需要被分配CPU;
2.遍歷拿到所有可用的worker,然后獲得每個(gè)worker已經(jīng)分配的CPU核數(shù);
3.獲得可以分配的CPU的核數(shù),循環(huán)遍歷每個(gè)worker,并為其分配一個(gè)CPU;
4.循環(huán)啟動(dòng)每個(gè)worker上的executor;
基于非平均分配算法與平均分配算法的區(qū)別:
區(qū)別在于:基于非平均分配算法,在遍歷所有可用的worker,為每個(gè)worker盡量分配多的CPU,然后在每個(gè)分配了CPU的worker上創(chuàng)建一個(gè)Executor并通知worker啟動(dòng)executor。
總結(jié):本節(jié)課主要介紹了一下資源調(diào)度的實(shí)現(xiàn),雖然內(nèi)容比較短,但是非常重要,在后期關(guān)于spark調(diào)優(yōu)會(huì)起到很大的幫助。下篇文章會(huì)接著我們本篇的內(nèi)容,來分析我們的相關(guān)應(yīng)用到底是如何進(jìn)行啟動(dòng)的;歡迎關(guān)注。
如需轉(zhuǎn)載,請(qǐng)注明: