本發(fā)明屬于hadoop平臺的任務(wù)調(diào)度問題,實際上也是任務(wù)和tasktracker之間的組合優(yōu)化問題。首先通過引入minjob和singlepercent兩個參數(shù)以及結(jié)合當前集群中可用的slot數(shù)量構(gòu)建調(diào)度模型,然后將預測執(zhí)行時間、本地任務(wù)個數(shù)和機器負載作為優(yōu)化目標,最后采用基于聚類改進的遺傳算法對其進行優(yōu)化,是一種使用計算技術(shù)、遺傳算法、聚類分析實現(xiàn)對大數(shù)據(jù)處理平臺hadoop任務(wù)調(diào)度的方式。
背景技術(shù):
由于現(xiàn)在的衣食住行和工作等越來越依賴于互聯(lián)網(wǎng),導致了互聯(lián)網(wǎng)中數(shù)據(jù)的爆發(fā)式增長,而這些數(shù)據(jù)不僅僅是量級上的增長,在這些數(shù)據(jù)的背后隱藏著很多的信息,這些信息往往對某個企業(yè)乃至某個行業(yè)來說都是至關(guān)重要的。在這樣的背景下開源大數(shù)據(jù)平臺hadoop成為了使用最廣泛的大數(shù)據(jù)處理平臺之一。
hadoop平臺中最關(guān)鍵的的一個環(huán)節(jié)之一便是根據(jù)任務(wù)對資源的需求控制任務(wù)執(zhí)行順序和資源使用的調(diào)度環(huán)節(jié)。這個環(huán)節(jié)直接關(guān)系到hadoop平臺的整體性能和系統(tǒng)資源的利用情況。hadoop官方現(xiàn)在有三種調(diào)度算法fifo、capacity和fair,但是fifo只適合于單用戶和集群負載比較小的情況,capacity和fair雖然是多用戶的但都是根據(jù)配置文件來控制資源的資源使用,這需要配置大量的參數(shù),這無疑加大了管理的難度并且在一個有幾百臺機器的異構(gòu)集群中幾乎是不可能的。
針對hadoop現(xiàn)有調(diào)度算法的缺點,很多研究學者都對其進行了研究和改進并提出了自己的調(diào)度算法。mateizaharia等人提出了延遲調(diào)度算法,在這種算法中,當有slave節(jié)點請求分配map任務(wù)時,如果無法滿足節(jié)點的本地性,則先讓map任務(wù)等待d1時長,希望在這段時間以內(nèi)有滿足map任務(wù)本地性的slave節(jié)點請求任務(wù)。但是這樣在集群負載很大的時候容易造成某個任務(wù)等待時間過長。ghods等人提出了dominantresoucefairness(drf),drf算法意在將資源公平地分給不同的用戶,但這種算法不適用于異構(gòu)集群。rasooli等人提出了coshh,他針對不同類型的作業(yè)對資源的需求不同提出了這種算法,但是這種算法開銷很大,當集群的負載變輕時,并不適用。jiantan等人提出了一種調(diào)度reduce任務(wù)的策略,在該算法中,根據(jù)map任務(wù)的進度計算reduce任務(wù)的調(diào)度時機。但是該算法中沒有考慮map任務(wù)的執(zhí)行時間問題。xiaotongzhang等人提出了改進的srt算法,該算法根據(jù)map任務(wù)的最短食欲時間來調(diào)度任務(wù)。但該算法容易導致系統(tǒng)資源得不到充分的利用。國內(nèi)學者楊倩茹等人提出了一種引入內(nèi)存平衡的hadoop平臺作業(yè)調(diào)度算法fmscheduler,在調(diào)度過程中加入了內(nèi)存比較機制、調(diào)整作業(yè)公平權(quán)重計算方法以及作業(yè)預留機制。朱宗斌等人提出了一種基于自適應(yīng)調(diào)整交叉和變異操作的概率的遺傳算法的hadoop調(diào)度算法,但是他對任務(wù)本身只考慮了任務(wù)執(zhí)行時間這一個約束條件并且并沒有對遺傳算子進行改進。徐肖等提出了一種基于分段編碼遺傳算法的hadoop調(diào)度算法,但是他的適應(yīng)度函數(shù)也只考慮了任務(wù)執(zhí)行時間這一個約束條件。
因此,本發(fā)明通過引入了2個參數(shù):一次最少處理job個數(shù)minjob和當一個大任務(wù)獨占資源時最多可占用的資源比例singlepercent并結(jié)合當前集群中可用的slot數(shù)目來建立hadoop任務(wù)調(diào)度模型,并以任務(wù)預測執(zhí)行時間、本地任務(wù)個數(shù)以及機器負載作為優(yōu)化目標,使用基于最小生成樹聚類改進的遺傳算法(cga)來求解模型。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是通過較少的配置文件項以及集群中的可用slot數(shù)目建立一個更合理的使用遺傳算法進行hadoop任務(wù)調(diào)度的模型,然后采用任務(wù)預測執(zhí)行時間、本地任務(wù)個數(shù)和機器負載作為優(yōu)化目標,并采用基于最小生成樹聚類改進的遺傳算法求解模型以得到性能更好的調(diào)度器。
設(shè)定一個hadoop集群,hadoop集群中有p個tasktracker,m個job被提交到j(luò)obtracker,ttsl表示tasktracker的列表,且ttsl={tts1,tts2,...,ttsp},ttsl中的各個元素表示各個tasktracker的列表;jobqueue表示job的隊列,jobqueue={job1,job2,...,jobm},jobqueue中的各個元素表示各個job。
1.構(gòu)建taskqueue
用戶使用hadoop集群時,被初始化后的job都以jobinprogress對象的形式都存放在jobqueue中。hadoop調(diào)度問題最終是一個task和tasktracker的組合優(yōu)化問題,因此使用遺傳算法解決hadoop調(diào)度問題的第一步便是將jobqueue中的job使用策略構(gòu)造taskqueue。
通過引入兩個參數(shù)和當前集群中可用的slot數(shù)目來自適應(yīng)地確定taskqueue的長度和taskqueue中的task,該taskqueue與編碼緊密相關(guān),參數(shù)如下:
minjob:一次最少處理job個數(shù),由用戶配置文件實現(xiàn),是一個大于1的整數(shù)。
singlepercent:當一個大任務(wù)獨占資源時最多可占用的資源比例,由用戶配置文件實現(xiàn),是一個0-1之間的浮點數(shù)。
numsofslot:當前集群中可用的slot的數(shù)目,由系統(tǒng)自動獲取。
2.適應(yīng)度函數(shù)
在遺傳算法中,適應(yīng)度函數(shù)有著至關(guān)重要的作用,因遺傳算法的思想來源于自然進化中的“優(yōu)勝劣汰”,每個染色體的優(yōu)劣程度便是由適應(yīng)度函數(shù)決定的。
在hadoop集群中,調(diào)度器的性能直接影響著hadoop的性能,而衡量一個調(diào)度器性能的指標有以下幾條:
(1)所有作業(yè)的平均完成時間。
(2)任務(wù)的本地性
(3)能否滿足用戶的資源需求
(4)集群中各個節(jié)點的負載
采用任務(wù)預測執(zhí)行時間、本地任務(wù)個數(shù)以及機器負載三項性能指標的組合作為適應(yīng)度函數(shù)。而且這三個性能指標是通過構(gòu)建3個矩陣來完成計算的,分別是任務(wù)預測執(zhí)行時間etc矩陣,本地任務(wù)ltc矩陣以及機器負載loadlist矩。
2.1構(gòu)建三個數(shù)據(jù)結(jié)構(gòu)
(1)構(gòu)建etc矩陣
構(gòu)建etc矩陣是根據(jù)taskqueue和tasktracker的列表進行構(gòu)建的,如圖2所示為一個etc矩陣,其元素eij代表第i個任務(wù)在第j個tasktracker上的預測執(zhí)行時間。
(2)構(gòu)建ltc矩陣
構(gòu)建ltc矩陣是根據(jù)taskqueue和tasktracker的列表進行構(gòu)建的,如圖2所示為一個etc矩陣,其元素lij代表第i個任務(wù)在第j個tasktracker上是否為本地任務(wù)。
(3)構(gòu)建loadlist
loadlist是根據(jù)tasktracker上的能夠使用的資源個數(shù)和正在執(zhí)行的任務(wù)個數(shù)來確定的。
2.2構(gòu)建適應(yīng)度函數(shù)
有了以上三個數(shù)據(jù)結(jié)構(gòu)就可以構(gòu)造適應(yīng)度函數(shù)了。
本方法對染色體的評價是對染色體解碼以后進行計算,并且使用預測執(zhí)行時間、本地性數(shù)量、負載三個標準同時進行衡量。
3.在表現(xiàn)型空間進行種群劃分操作
編碼使用任務(wù)編號-tasktracker編號,所以遺傳算法種群中個體之間的有以下特點:
(1)基因型空間中個體的索引代表任務(wù)的編號
(2)基因型空間中每一個索引上的值代表的是tasktracker的編號
(3)表現(xiàn)型空間解碼后的個體有任務(wù)預測執(zhí)行時間、本地性任務(wù)個數(shù)和機器負載三個特征
以上三個特點導致按照基因型空間各個基因位上值的歐式距離表示個體間的相似性是沒有意義的。
因此在計算種群的相似度矩陣時要在表現(xiàn)型空間,計算方法:根據(jù)解碼后個體的任務(wù)預測執(zhí)行時間、本地性認為個數(shù)和機器負載三個特種計算歐式距離確定他們之間的相似性。
4.使用基于最小生成樹改進的遺傳算法(cga)尋找最優(yōu)解
將cga用于調(diào)度hadoop任務(wù),編碼方式采用task編號-tasktracker編號,適應(yīng)度函數(shù)采用預測執(zhí)行時間、本地任務(wù)數(shù)、負載三個指標的組合。聚類操作在表現(xiàn)型空間進行,如下為基于cga的hadoop調(diào)度算法的步驟:
step1.根據(jù)配置文件中的參數(shù)minjob和singlepercent以及jobqueue中的job生成待調(diào)度的任務(wù)列表taskqueue。
step2.通過tasktrackermanager獲取集群中tasktracker列表ttsl。
step3.根據(jù)taskqueue和ttsl構(gòu)建etc矩陣,ltc矩陣以及l(fā)oadlist。
step4.根據(jù)taskqueue、ttsl以及popsize進行種群初始化,設(shè)當前代數(shù)為1。
step5.令當前種群為pop,判斷是否滿足停止進化條件,如果滿足執(zhí)行step10;如果不滿足到step6。
step6.對pop中的染色體進行解碼,解碼后求出每個染色體的預測執(zhí)行時間timeexcute、totalnumlocal、load,然后根據(jù)這三個屬性求出種群中個體的相似度矩陣dis。
step7.將pop中的染色體兩兩之間形成一條邊構(gòu)建一個無向圖,并使用dis中的值作為無向圖中邊的權(quán)值形成有權(quán)無向圖g,然后使用最小生成樹聚類對種群進行劃分。
step8.對pop進行輪盤賭選出一個個體indiv1,然后隨機生成一個0-1之間的浮點數(shù),如果浮點數(shù)大于交叉概率pc,直接把選擇出的個體遺傳到新種群popn中,否則,獲取indiv1的類別為classid1,再隨機的在pop中選取一個個體indiv2,獲取indiv2的類別為classid2,使得classid1!=classid2,然后使得indiv2與indiv1進行交叉操作,然后把新個體放入popn中,并把這個過程循環(huán)popsize次。
step9.對popn進行輪盤賭選擇選出一個個體indiv,隨機生成一個0-1間的浮點數(shù),如果這個浮點數(shù)大于pm,則把indiv直接遺傳至popnm中,否則,對indivi進行變異操作,把變異后的結(jié)果放入popnm中,把這個過程循環(huán)popsize次。并使pop=popnm;
step10.選出pop中適應(yīng)度值最好的一個染色體記為bestindiv,對bestindiv進行解碼操作生成一個map數(shù)據(jù)結(jié)構(gòu),key值為tasktracker的編號,value值為要在該tasktracker上執(zhí)行的任務(wù)列表。
step11.根據(jù)請求調(diào)度任務(wù)的tasktracker的名稱,把任務(wù)列表返回給jobtracker。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點:
1).本發(fā)明中的調(diào)度器配置文件中只有兩個配置參數(shù):minjob和singlepercent,再系統(tǒng)自動獲取的當前集群中可用的slot數(shù)目不僅可以自適應(yīng)地確定taskqueue的長度,即遺傳算法編碼長度,而且可以防止一個大的任務(wù)獨占資源,建立了更加合理的模型。
2).本發(fā)明中將hadoop任務(wù)調(diào)度問題看做是任務(wù)和tasktracker之間的組合優(yōu)化問題,使用任務(wù)預測執(zhí)行時間、本地任務(wù)個數(shù)和機器負載作為性能指標同時也是優(yōu)化目標,采用遺傳算法進行尋優(yōu)可以為tasktracker分配更加合適的任務(wù)列表。
2).本發(fā)明采用了基于最小生成樹聚類改進遺傳算法對建立hadoop任務(wù)調(diào)度模型進行優(yōu)化求解,改進的遺傳算法通過對種群進行最小生成樹聚類,使物種內(nèi)的個體具有很高的相似度,而物種間的相似度較低,利用物種間的交叉可以維持種群多樣性,抑制未成熟收斂現(xiàn)象。
3).將本發(fā)明使得聚類操作在表現(xiàn)型空間進行,采用每個個體解碼后的預測執(zhí)行時間、本地任務(wù)個數(shù)以及機器負載計算個體間的間距,使得聚類更有實際意義,最終得到的調(diào)度器性能更高。
附圖說明
圖1構(gòu)建taskqueue流程;
圖2etc矩陣圖示;
圖3ltc矩陣圖示;
圖4為本發(fā)明所涉及方法的主流程圖;
圖5染色體示意圖
圖6解碼后的染色體示意圖
具體實施方式
下面結(jié)合附圖對本發(fā)明做進一步說明。
本方法將hadoop任務(wù)調(diào)度看做是任務(wù)和tasktracker的組合優(yōu)化問題,采用task編號-tasktracker編號,即一條染色體即為一種解決方案。使用預測執(zhí)行時間、本地任務(wù)個數(shù)和機器負載的組合作為適應(yīng)度函數(shù)。使用cga對所構(gòu)建的模型求解對中得到一種在預測執(zhí)行時間、本地任務(wù)個數(shù)和機器負載三個方面都相對較好的解決方案。
本方法所涉及的主流程如圖4所示,包括以下步驟;
步驟一,設(shè)定參數(shù),進行個體編碼。
1.設(shè)定參數(shù)
需要用戶設(shè)定的參數(shù)只有連個,minrun和singlepercent,這里令minrun=3,lengthoftaskqueue=20。
遺傳算法參數(shù):popsize=50,pc=0.6,pm=0.2,聚類系數(shù)0.9,maxgen=80。
2.計算taskqueue
3.構(gòu)建taskqueue的整個過程如圖1所示,步驟如下:
(1)設(shè)置配置文件,在配置文件中設(shè)置兩個變量,一個是默認處理的job數(shù)量minjob,它的值是一個整數(shù)默認值是3;一個是當某個大job出現(xiàn)時,為了避免它獨占集群中的資源,允許它占資源總量的百分比singlepercent,它的值是一個大于0小于1的浮點數(shù),默認值0.5。這也是使用遺傳算法構(gòu)建hadoop調(diào)度器的一個優(yōu)點,相比hadoop現(xiàn)有三種調(diào)度器的十幾項繁瑣的配置參數(shù),本方法的調(diào)度器僅需配置這兩個參數(shù)。
(2)對比配置文件中的minjob的值和jobqueue的長度,如果jobqueue的長度大于等于minjob則從jobqueue中取出minjob個job,否則把jobqueue中的job都取出,并令minjob=j(luò)obqueue.size()。
(3)創(chuàng)建一個taskqueue,初始長度lengthoftaskqueue為此時集群中可用的slot數(shù)量。并獲取minjob個job的task總數(shù)s。
(4)如果s>lengthoftaskqueue,并且minrun>1,令minrun=minrun-1,再獲取s并與lengthoftaskqueue比較;如果s<lengthoftaskqueue跳轉(zhuǎn)到(5),s=lengthoftaskqueue,跳轉(zhuǎn)到(6)。
(5)如果s<lengthoftaskqueue,令offset=lengthoftaskqueue–s,并再從jobqueue中取第minjob+1個job的offset個task。
(6)如果s=lengthoftaskqueue,則把minrun個job的task直接放到taskqueue中。
(7)如果s>lengthoftaskqueue并且minrun=1,taskqueue為空,則令s=int[lengthoftaskqueue*singlepercent],然后取這個job的s個task放入taskqueue中;再令lengthoftaskqueue=lengthoftaskqueue–s,minrun=配置文件中的初始值,然后取jobqueue中從第2個job開始的minrun個,s為這minrun個job的task數(shù),轉(zhuǎn)入(4)。
4.計算etc矩陣
因為不同用戶編寫的mapreduce對資源是需求不相同,所以在調(diào)度的過程中要考慮job本身的資源需求和tasktracker的資源特性對任務(wù)執(zhí)行的影響。job本身的資源需求被稱為作業(yè)特征,用來表示job對資源的使用情況,比如job的cpu平均使用率、內(nèi)存的平均使用率等,作業(yè)特征用戶編寫mapreduce程序的時候進行設(shè)定;tasktracker的資源特性被稱為節(jié)點特征,用來描述單個tasktracker節(jié)點上計算資源的狀態(tài)和質(zhì)量,如某個tasktracker上cpu的使用率、空閑的物理內(nèi)存以及可用的slot數(shù)量等,tasktracker的節(jié)點特征又分為兩類,系統(tǒng)運行過程中保持不變的節(jié)點屬性,如處理器的個數(shù)、物理內(nèi)存總量等,和在作業(yè)執(zhí)行過程會隨之變化的節(jié)點屬性,如cpu的使用率、內(nèi)存的空閑量等。tasktracker的節(jié)點特性會通過心跳信息匯報給jobtracker。
設(shè)有m種資源m[r1,r2,...,rm],如果任務(wù)t用戶為其配置的資源為t[x1,x2,...,xm],而某個tasktracker擁有的資源量為[y1,y2,...,ym]。
通過這兩者間資源的比值得出一個相對權(quán)值,取所有資源中權(quán)值最大的那個,就是該任務(wù)在該tasktracker上執(zhí)行時tasktracker擁有的資源相對于任務(wù)對資源的需求最少滿足的那個資源。權(quán)值ω計算方式:
通過tasktracker的歷史信息計算出該tasktracker在以往的歷史任務(wù)中,執(zhí)行map任務(wù)的平均速度avemapexcutetime和執(zhí)行reduce的平均速度avereduceexcutetime;
使得權(quán)值ω和任務(wù)在該節(jié)點上執(zhí)行的平均速度相乘便估算出該任務(wù)在該tasktracker上執(zhí)行需要的時間。即
mapexcutetime=ω*avemapexcutetime(2)
reduceexcutetime=ω*avereduceexcutetime(3)
但是根據(jù)task的某些不同性質(zhì)計算的方式也略有差別。根據(jù)mapreduce框架任務(wù)分為map和reduce,而對于map任務(wù)來說又有數(shù)據(jù)本地性和非本地性之分,任務(wù)是否在本地執(zhí)行對于任務(wù)執(zhí)行時間來說是關(guān)鍵的。根據(jù)作業(yè)對資源的需求不同,將作業(yè)分為i/o密集型和cpu密集型。這兩種類型的作業(yè)正如其名,i/o密集型的任務(wù)一般會伴隨有大量數(shù)據(jù)的輸入輸出,需要較大的存儲空間,而cpu密集型的任務(wù)多是計算復雜型但是并沒有太大的數(shù)據(jù)輸出輸入,因此需要占用較多的cpu,這兩類任務(wù)的執(zhí)行預測時間計算方式也是不同的。
因此,在公式(2)和公式(3)的基礎(chǔ)上按照以下分類計算某個任務(wù)在某個tasktracker上的預測執(zhí)行時間。
map
在hadoop中,cpu密集型的任務(wù)多是做科學計算,因此根據(jù)一個maptask是否有輸入的block來判斷是否為cpu密集型任務(wù)。jobinprogress中有一個方法getnonlocalmaps()能夠用來判斷一個task是否有輸入數(shù)據(jù)塊。如果沒有輸入數(shù)據(jù)塊,則說明該任務(wù)為cpu密集型,否則為i/o密集型。
acpu密集型map
在使用公式(1)計算ω時,為每一項資源增加一個權(quán)值,并且各項的權(quán)值之和為1,由于cpu密集型的任務(wù),要占用較多的cpu,所以給cpu的權(quán)值較大一些,剩下的資源權(quán)值相同,以突顯cpu的比重。假設(shè)現(xiàn)有一個cpu密集型的map,其需要占用cpu百分比為x1,而tasktracker的cpu使用率為y1,a和b均為子權(quán)值,此處,a為第一項
mapexcutetime=ω*avemapexutetime(5)
bi/o密集型map
由于i/o密集型需要讀取大量的輸入數(shù)據(jù)并伴隨大量輸出數(shù)據(jù)的寫入,所以這類任務(wù)對內(nèi)存的需求會比較大,因此在計算ω時要把內(nèi)存的權(quán)重設(shè)置大一些,而且涉及到計算所輸入的數(shù)據(jù)是否是在tasktracker本地,如果不在本地,任務(wù)的執(zhí)行時間的估算需要加上從hdfs下載輸入數(shù)據(jù)所需的時間。
現(xiàn)假設(shè)有一個i/o密集型map任務(wù),其需要占用內(nèi)存為x2,而tasktracker的可用內(nèi)存為y2,a和b均為子權(quán)值,此處,b為第一項
如果tasktracker為該map所需輸入數(shù)據(jù)的本地節(jié)點,則
mapexcutetime=ω*avemapexcutetime(7)
否則,假設(shè)該節(jié)點從hdfs將map執(zhí)行所需輸入數(shù)據(jù)下載到本地需要的時間為tdownload,則
mapexcutetime=ω*avemapexcutetime+tdownload(8)
reduce
由于數(shù)據(jù)本地性這個概念只是針對map才有的,所以對于reduce
reduceexcutetime=ω*avereduceexcutetime(9)
為了便于適應(yīng)度函數(shù)值的計算,這里引入一個矩陣,用來表示各個任務(wù)在每個tasktracker上的預測執(zhí)行時間,稱為etc矩陣。假設(shè)現(xiàn)在集群中有p個任務(wù)等待調(diào)度,有q個tasktracker作為執(zhí)行任務(wù)的節(jié)點,即
t=[t1,t2,...,tp]
r=[tt1,tt2,...,ttq]
則etc矩陣的大小為p*q,如圖2所示,其中i∈[1,p],j∈[1,q]
etc矩陣中的元素ei,j表示第i個任務(wù)在第j個tasktracker上面的預測執(zhí)行時間,是通過上面提到的流程計算出的。
5.計算ltc矩陣
任務(wù)的本地性也是衡量調(diào)度器性能的一個重要標準,在本文中會構(gòu)建一個矩陣ltc,其元素li,j表示第i個任務(wù)在第j個tasktracker上面是否為本地任務(wù),即該任務(wù)的執(zhí)行數(shù)據(jù)是否存儲在該tasktracker所在的節(jié)點上,如果是,則li,j=1,否則li,j=0。ltc矩陣的大小為p*q,如圖3所示,其中i∈[1,p],j∈[1,q]
6.計算loadlist
在hadoop集群中,單個tasktracker的負載也是很重要的,尤其是在異構(gòu)集群中,因為不同的節(jié)點的節(jié)點屬性有所差別,如果在調(diào)度的過程中不考慮這個因素,便會造成一部分節(jié)點負載過大,一部分節(jié)點資源浪費,于集群來說這樣不利于資源的充分利用,于任務(wù)來說,被分配到一個負載大的節(jié)點上會增加它等待的時間,因此本文中構(gòu)建了一個列表loadlist用來記錄集群中各個節(jié)點的負載。
設(shè)有一個tasktracker,其slot總數(shù)為numsofslot,其上正在運行的任務(wù)數(shù)為runningnums,則
load=runningnums/numsofslot(10)
load可以代表該節(jié)點上的負載情況,load越大說明這個節(jié)點上的正在執(zhí)行的任務(wù)數(shù)越多,空閑的資源越少,負載越大。如公式(11)所示為loadlist,其大小為q,i∈[1,q]
loadlist(i)=[load1,load2,...,loadq](11)
7.進行個體編碼
本方法采用了task編號-tasktracker編號的編碼方式,所以首先要獲取tasktracker列表ttsl,然后根據(jù)圖1所示流程構(gòu)建taskqueue,假設(shè)ttsl={tts1,tts2,...,ttsp},taskqueue={task1,task2,...,taskn},則染色體長度為n,染色體每一位的取值代表該編號的task被分配到的tasktracker的編號,則基因位上的最大取值為ttsl的長度p,即每一位基因的取值范圍為[1,p]。一條染色體代表一種解決方案。則一條染色體中第i個基因位的值j代表第i個任務(wù)在第j個tasktracker上面執(zhí)行。如圖5所示為染色體示意圖。
8.計算個體適應(yīng)度
本方法中的適應(yīng)度函數(shù)是使用任務(wù)預測執(zhí)行時間、本地性任務(wù)個數(shù)以及機器負載三個參數(shù)聯(lián)合組成的,過程如下:
(1)預測執(zhí)行時間
由于hadoop集群的各個tasktracker之間是并行的,所以各個tasktracker上的任務(wù)時同時進行得,所以對于一個染色體來說,整體的預測執(zhí)行時間是各個tasktracker上任務(wù)預測執(zhí)行時間的最大值,而單個tasktracker上的任務(wù)的執(zhí)行時間是調(diào)度分配給該tasktracker的任務(wù)列表中所有任務(wù)的預測執(zhí)行時間總和。假設(shè)第j個tasktracker的任務(wù)列表為list,且list中任務(wù)的個數(shù)為n,即第j個tasktracker上任務(wù)的預測執(zhí)行時間:
設(shè)集群中一共有q個tasktracker,則該染色體所代表的解決方案的預測執(zhí)行時間為:
timeexcute=max{timeoftt(1),timeoftt(2),...,timeoftt(q)}(13)
因本文中遺傳算法設(shè)計為了尋最大值,所以令
(2)本地性數(shù)目
由于hadoop任務(wù)執(zhí)行時需要的輸入數(shù)據(jù)存儲在hdfs中,并且通常數(shù)據(jù)量比較大,因此如果任務(wù)被分配到它所需的輸入數(shù)據(jù)所在的節(jié)點執(zhí)行會比較高效,所以在評價一個分配方案時,要考慮該方案中本地任務(wù)的個數(shù)。
假設(shè)第j個tasktracker的任務(wù)列表為list,且list中任務(wù)的個數(shù)為n,即第j個tasktracker上本地執(zhí)行的任務(wù)數(shù)為:
因此,設(shè)集群中一共有q個tasktracker,則一條染色體所代表的方案的本地執(zhí)行任務(wù)總數(shù)為:
因本地任務(wù)的數(shù)本身是一個最大化問題,所以
flocal(x)=totalnumlocal(x),x∈[1,popsize](17)
(3)負載
hadoop中負載是衡量調(diào)度性能的一個重要指標,對整個集群來說,各個節(jié)點的負載越平衡越好,對單個tasktracker來說負載越小越好,因此用來評價染色體的負載是在負載列表loadlist中挑選最大值,然后使得這個值最小,這樣就避免某個性能相對較優(yōu)的tasktracker上負載過重。
因此,設(shè)集群中一共有q個tasktracker,則一條染色體所代表的方案的負載為:
load=max{loadlist[1],loadlist[2],...,loadlist[q]}(18)
在尋優(yōu)的過程中是尋找最大值,所以
綜上所述,基于遺傳算法的hadoop調(diào)度器中,適應(yīng)度函數(shù)為:
f(x)=ftime(x)+flocal(x)+fload(x),x∈[1,popsize](20)
在遺傳算法的進化過程中使用該適應(yīng)度函數(shù)評價,使用輪盤賭選擇算法將適應(yīng)度值相對較大的染色體進行遺傳操作。
步驟二,進行種群初始化
采用隨機初始化方法隨機地生成popsize個染色體,每個染色體的長度為taskqueue的長度n,每一個基因位上的值為[1,p]中任意的整數(shù)值。
步驟三,對種群進行解碼,記錄適應(yīng)度值。
采用的適應(yīng)度函數(shù)為公式(12),而預測執(zhí)行時間、本地任務(wù)個數(shù)和機器負載都是表現(xiàn)型空間中個體的特性,所以要先將初始種群中的個體解碼形成表現(xiàn)型空間,然后根據(jù)etc、ltc、loadlist計算并記錄每個個體的預測執(zhí)行時間、本地任務(wù)個數(shù)和機器負載,然后根據(jù)公式(12)計算適應(yīng)度值。
所采用的編碼方式覺得了解碼方式,只要按照基因位上tasktracker的編號獲取相應(yīng)的任務(wù)編號,最終的結(jié)果是按照ttsl中tasktracker的編號獲取到相同個數(shù)的任務(wù)列表。如圖6為解碼后的染色體。
步驟四,對種群進行最小生成樹聚類。
(1)根據(jù)解碼后得出每個染色體的預測執(zhí)行時間timeexcute、totalnumlocal、load以及公式(22)求出種群中個體的相似度矩陣dis
(2)將pop中的染色體兩兩之間形成一條邊構(gòu)建一個無向圖,并使用dis中的值作為無向圖中邊的權(quán)值形成有權(quán)無向圖g。
(3)利用prim算法求出這個無向圖的最小生成樹。
(4)確定最小生成樹的斷邊閾值δ*m,m為最小生成樹中popsize-1條邊的平均權(quán)重,δ是一個大于0小于1的調(diào)節(jié)因子,這里取0.999。
(5)通過切斷生成樹中的邊進行分類:從最小生成樹起點開始遍歷,將權(quán)重大于閾值的邊去掉,形成一個森林,屬于同一個樹的邊就屬于同一類。
(6)對森林進行深度遍歷,對每一類進行記錄保存。
步驟五,種群內(nèi)個體進行交叉操作
使用輪盤賭從種群中選擇一個個體indiv1,然后隨機生成一個0-1之間的浮點數(shù),如果浮點數(shù)大于pc,直接把選擇出的個體遺傳到新種群中,否則,獲取indiv1的類別為classid1,再隨機的在pop中選取一個個體indiv2,獲取indiv2的類別為classid2,使得classid1?。絚lassid2,然后使得indiv2與indiv1進行交叉操作,然后把新個體放入新種群中,并把這個過程循環(huán)popsize次。
步驟六,種群內(nèi)個體進行變異操作。
從新種群中進行輪盤賭選擇選出一個個體indiv,隨機生成一個0-1間的浮點數(shù),如果這個浮點數(shù)大于pm,則把indiv直接遺傳至新種群中,否則,對indivi進行變異操作,把變異后的結(jié)果放入新種群中,把這個過程循環(huán)popsize次。
步驟七,重復執(zhí)行三到六步驟,得到最佳個體。
步驟八,解碼最佳個體,為各個tasktracker準好待調(diào)度的任務(wù)列表。
實驗結(jié)果
根據(jù)以上步驟本發(fā)明開發(fā)出了基于cga的hadoop調(diào)度器cgafxnew,并將該調(diào)度器應(yīng)用到了一個由表1中所示的4臺機器組成的異構(gòu)集群中,并提交了10個處理不同大小和類別的mapreduce任務(wù),并與fifo,fair,capacity做比較。
表1集群中四臺機器的硬件條件er
軟件:四臺主機的操作系統(tǒng)為32位的centos6.8,hadoop版本為1.2.1,jdk為jdk1.7.0_80。
(1)任務(wù)執(zhí)行時間如表2所示:
表2任務(wù)執(zhí)行時間
從表2中可以看到cgafxnew的任務(wù)執(zhí)行時間比gafxnew的大部分有所減短,并且在六種算法中有很多job的任務(wù)執(zhí)行時間是最短的。
(2)本地性任務(wù)個數(shù)如表3所示
表3本地性任務(wù)個數(shù)
從表3中可以看到,使用cgafxnew對10個job的任務(wù)進行調(diào)度后,本地性任務(wù)所占比例有所提高,本地性任務(wù)的增多也很大程度上的減短了任務(wù)執(zhí)行的時間。
(3)任務(wù)在三個slave節(jié)點上的分布如表4所示
表4任務(wù)在節(jié)點中的分布
從表4可以看到,任務(wù)在三個slave節(jié)點上的分布按照節(jié)點的資源多少、性能好壞分布合理。
綜上所述,將cga應(yīng)用到hadoop的調(diào)度后,并且任務(wù)的本地性比例有所增加,并且任務(wù)在三個節(jié)點上的分布更加合理,失敗率下降,而且job的執(zhí)行時間也普遍在減短,從而可以得出基于cga的hadoop調(diào)度算法能使得集群中的資源被更加合理的應(yīng)用,而且對于用戶來說所提交的job的執(zhí)行時間也減短,因此,基于最小生成樹聚類改進的遺傳算法的hadoop調(diào)度算法性能有所提高。