專利名稱:一種hdfs運行時數(shù)據(jù)塊平衡方法
一種HDFS運行時數(shù)據(jù)塊平衡方法技術(shù)領(lǐng)域
本發(fā)明屬于計算機技術(shù)領(lǐng)域,涉及一種數(shù)據(jù)塊平衡方法,尤其是一種云計算環(huán)境下HDFS (Hadoop Distributed File System)在運行過程中數(shù)據(jù)塊平衡方法。
背景技術(shù):
Hadoop是由Apache開源組織開發(fā)的一個高可靠性和高可擴展性的存儲與分布式并行計算平臺,最早是作為開源搜索引擎項目Nutch的基礎(chǔ)平臺而開發(fā)的,之后從Nutch項目中獨立出來,成為典型的開源云計算平臺之一。Hadoop核心實現(xiàn)了按塊存儲的分布式文件系統(tǒng)(Hadoop Distributed File System,HDFS)以及用于分布式計算的MapReduce計算模型。HDFS為Hadoop集群提供由眾多節(jié)點組成的存儲系統(tǒng),在存儲大規(guī)模數(shù)據(jù)文件時,會將文件切分成多個相同大小的數(shù)據(jù)塊(最后一份數(shù)據(jù)塊例外),分布在集群中所有節(jié)點上。 為了保證可靠性,HDFS會依據(jù)配置為每一份數(shù)據(jù)塊創(chuàng)建多個副本,并放置在集群的不同節(jié)點上。HDFS為上層MapReduce計算引擎提供數(shù)據(jù)存儲服務(wù)。Hadoop MapReduce將應(yīng)用劃分成許多小任務(wù)并行執(zhí)行,每個小任務(wù)就對計算節(jié)點本地存儲的數(shù)據(jù)塊進行處理。
HDFS文件系統(tǒng)采用分塊機制分布式存儲數(shù)據(jù)集,并通過數(shù)據(jù)塊冗余策略來提高系統(tǒng)可靠性,每個數(shù)據(jù)塊在系統(tǒng)中都有多個副本同時存在,這些副本分布在系統(tǒng)中多個機架內(nèi)的多個節(jié)點上,防止因單個節(jié)點出現(xiàn)故障造成數(shù)據(jù)塊的丟失。此外,這種分布式冗余機制能保證文件的并發(fā)讀取,使得HDFS更適合“一次寫,多次讀”的數(shù)據(jù)處理模式。為實現(xiàn)這種數(shù)據(jù)塊冗余策略,HDFS文件系統(tǒng)在寫入數(shù)據(jù)時必須保證有多個副本同時寫入。
HDFS文件系統(tǒng)在寫入數(shù)據(jù)流時需先通過NameNode獲取多個節(jié)點構(gòu)成節(jié)點管線, 當數(shù)據(jù)流到達管線中的第一個節(jié)點時,該節(jié)點存儲數(shù)據(jù)并發(fā)送給管線中的第二個節(jié)點。同樣的,第二個節(jié)點存儲數(shù)據(jù)并發(fā)送給管線中的第三個節(jié)點……以此類推,完成多份副本的寫入。
HDFS文件系統(tǒng)在放置數(shù)據(jù)塊及其副本時綜合考慮以下幾點
I)當提交數(shù)據(jù)的節(jié)點也是HDFS文件系統(tǒng)中存儲數(shù)據(jù)塊的節(jié)點時,該節(jié)點上放置一份數(shù)據(jù)塊的備份;
2)—個數(shù)據(jù)塊的備份必須分布在多個機架上,避免單個機架故障導(dǎo)致整個數(shù)據(jù)不可用;
3)與提交數(shù)據(jù)節(jié)點處于同一個機架內(nèi)的其他節(jié)點上也必須有數(shù)據(jù)塊的備份,這樣可以盡量減少機架間的通信和IO開銷;
4)在滿足前面條件的前提下兼顧考慮節(jié)點存儲空間的使用率,盡可能保證各個節(jié)點存儲使用率平衡。
Hadoop Map階段是整個MapReduce作業(yè)執(zhí)行的第一階段,主要完成將外部輸入數(shù)據(jù)轉(zhuǎn)化為〈Key,Value)形式的中間數(shù)據(jù),提供給后續(xù)Reduce階段作為輸入數(shù)據(jù)。分布式并行處理環(huán)境下,Hadoop Map階段使用分布式文件系統(tǒng)HDFS作為輸入數(shù)據(jù)源,并在“移動計算比移動數(shù)據(jù)更經(jīng)濟”的指導(dǎo)原則下,將用戶在提交作業(yè)時指定的Map處理過程分配到各個HDFS數(shù)據(jù)塊存儲節(jié)點上執(zhí)行。當某個節(jié)點被分配的處理過程所需的輸入數(shù)據(jù)剛好在該節(jié)點上存儲時,稱該處理過程滿足數(shù)據(jù)本地性。
Hadoop MapReduce通過節(jié)點任務(wù)請求分配機制避免了多個數(shù)據(jù)塊副本重復(fù)處理的問題。但從Hadoop Map階段執(zhí)行過程的分析可知,Map任務(wù)輸入數(shù)據(jù)的本地性對Map任務(wù)的執(zhí)行速率也會產(chǎn)生很大影響。當Map輸入數(shù)據(jù)與Map任務(wù)執(zhí)行在同一個節(jié)點上時將節(jié)省數(shù)據(jù)塊網(wǎng)絡(luò)傳輸開銷,提高Map任務(wù)執(zhí)行速率。在現(xiàn)有Hadoop體系結(jié)構(gòu)中,HDFS數(shù)據(jù)塊副本的分布狀態(tài)通過Hadoop任務(wù)調(diào)度器直接影響Map任務(wù)輸入數(shù)據(jù)的本地性。
因此,現(xiàn)有的HDFS數(shù)據(jù)塊放置策略雖然能保證各個節(jié)點間的數(shù)據(jù)塊數(shù)量大致平衡,但由于某些數(shù)據(jù)塊副本的分布不合理,導(dǎo)致某些節(jié)點“竊取”其他節(jié)點的本地Map任務(wù)后,其他節(jié)點由于本地Map任務(wù)被分配同樣需要“任務(wù)竊取”,這種“任務(wù)分配偏移”現(xiàn)象進一步加大了 Map階段非本地數(shù)據(jù)的傳輸量,給整個網(wǎng)絡(luò)帶來巨大的傳輸壓力,影響整個階段的運行效率。此外,當節(jié)點間數(shù)據(jù)塊數(shù)目平衡時,節(jié)點任務(wù)處理速率不同也會導(dǎo)致出現(xiàn)較大程度的非本地化任務(wù)處理。發(fā)明內(nèi)容
本發(fā)明的目的在于解決由于HDFS數(shù)據(jù)塊分布不均勻而導(dǎo)致的Map階段map任務(wù)數(shù)據(jù)本地性較低的問題,提供一種HDFS運行時數(shù)據(jù)塊平衡方法,該方法提出基于運行時數(shù)據(jù)塊移動HDFS平衡策略,通過預(yù)測節(jié)點任務(wù)請求提前判斷可能出現(xiàn)的非本地map任務(wù)執(zhí)行,并在相應(yīng)的節(jié)點間移動合適的數(shù)據(jù)塊,使得節(jié)點發(fā)出實際任務(wù)請求時候能夠得到本地 map任務(wù)的分配響應(yīng),從而提高Map階段的完成效率。
本發(fā)明的目的是通過以下技術(shù)方案來解決的
這種HDFS運行時數(shù)據(jù)塊平衡方法,包括以下步驟
I)節(jié)點本地任務(wù)列表預(yù)處理
I. I提出完全本地任務(wù)和非完全本地任務(wù)當HDFS的各個數(shù)據(jù)塊存在多個副本的時候,導(dǎo)致同一個任務(wù)會出現(xiàn)在不同節(jié)點的本地Map任務(wù)列表中,從而某個節(jié)點本地任務(wù)列表中剩余的map任務(wù)數(shù)η,意味著該節(jié)點能夠分配執(zhí)行的本地任務(wù)數(shù)是η ;
I. 2節(jié)點本地任務(wù)列表的預(yù)處理過程當各個節(jié)點依次發(fā)出任務(wù)請求時,從節(jié)點的本地任務(wù)列表中獲取當前可執(zhí)行的任務(wù)加入到節(jié)點的完全本地任務(wù)列表中,而本地任務(wù)列表中未被分配的任務(wù)則加入到非完全本地任務(wù)列表中;
2)節(jié)點運行時信息統(tǒng)計
通過設(shè)計NodeEvaluateInfo類來實現(xiàn)在該類中統(tǒng)計節(jié)點已經(jīng)處理的數(shù)據(jù)塊總數(shù)sum、節(jié)點已處理數(shù)據(jù)塊總耗時cost和作業(yè)的執(zhí)行進度tip,知道以上信息后計算節(jié)點平均塊處理時間cost/sum、節(jié)點當前運行任務(wù)剩余時間(1-tip) / (cost/sum);
3)節(jié)點速率評估與任務(wù)請求序列預(yù)測
3. I節(jié)點速率的評估由步驟2),采用COSIVNUMi來表示各個節(jié)點的數(shù)據(jù)處理速率,即節(jié)點處理單個任務(wù)的平均耗時;其中,NUMi為某一時刻節(jié)點i已完成的本地map任務(wù)數(shù),COSTi為處理這些本地任務(wù)所花費的總耗時;
3. 2系統(tǒng)任務(wù)請求序列的預(yù)測系統(tǒng)任務(wù)請求序列即從當前時刻開始到作業(yè)完成時為止,各個從節(jié)點向主節(jié)點申請任務(wù)執(zhí)行的時刻序列;在!'(|時刻,節(jié)點i正處理任務(wù)的進度為Pi,通過前面速率評估公式得到的節(jié)點處理單個數(shù)據(jù)塊平均耗時為Ti,則該節(jié)點的第K 次任務(wù)請求時間點tik為
T0+(I-Pi) XTi+(k-l) XTi k 彡 I ;
其中k表示從當前時刻算起該節(jié)點第k次任務(wù)請求;獲取各個節(jié)點的任務(wù)請求序列后,采用如下方式確定系統(tǒng)任務(wù)請求序列記系統(tǒng)剩余任務(wù)數(shù)為m,系統(tǒng)中節(jié)點數(shù)為n,對每個節(jié)點i,取其從當前時刻算起m次任務(wù)請求的時間點,記為{tn, ti2,…tim},n個節(jié)點將構(gòu)成nXm個時間點{t11,t12,· · · tim t21,t22,··· t2m,···,tnl,tn2, -tj ;將所有時間點按升序排列,取前m個,則可得到從當前時刻開始對系統(tǒng)中剩余m個任務(wù)的請求序列Rm. Rm(J-)^ik 即表明系統(tǒng)中第j個任務(wù)請求將由節(jié)點i在tik時刻發(fā)出,且該請求是節(jié)點i的第k個請求;
4)節(jié)點任務(wù)的分配分析與實現(xiàn)在步驟3)預(yù)測的節(jié)點請求序列下提前確定各個節(jié)點的任務(wù)分配情況;
5)數(shù)據(jù)塊移動節(jié)點對的選擇從任務(wù)請求序列中獲取發(fā)出請求的節(jié)點,接著從該節(jié)點的本地任務(wù)列表中獲取任務(wù),如果任務(wù)為空,則認定該節(jié)點是待平衡節(jié)點,將其加入到待平衡節(jié)點列表中;數(shù)據(jù)塊移動節(jié)點對選擇過程的第一步是遍歷allocate數(shù)組,構(gòu)建映射表Map〈node, List<Task>>,記錄所有數(shù)據(jù)塊源節(jié)點上的所有未分配任務(wù);
6 )節(jié)點間數(shù)據(jù)塊的移動
確定好待平衡節(jié)點和數(shù)據(jù)塊源節(jié)點后便可進行實際的數(shù)據(jù)塊移動;由于數(shù)據(jù)塊移動與節(jié)點任務(wù)執(zhí)行相互獨立且考慮到可能有多個數(shù)據(jù)塊需要移動,為提高效率以及簡化編程實現(xiàn),采用JAVA線程池技術(shù)實現(xiàn)整個數(shù)據(jù)塊移動。
進一步的,以上步驟4)中,模擬Hadoop調(diào)度器在當前預(yù)測的系統(tǒng)任務(wù)請求序列Rm下的響應(yīng)過程;依據(jù)各個節(jié)點的請求時機以及系統(tǒng)當前任務(wù)分配情況,確定對該請求的任務(wù)分配響應(yīng)并判斷該任務(wù)分配是否滿足任務(wù)本地性;確定任務(wù)的分配記錄通過 AllocatedRecord類實現(xiàn),該類通過記錄任務(wù)的分配標志、分配給的節(jié)點編號、分配的時間和該任務(wù)對應(yīng)的數(shù)據(jù)塊是否已加入代交換列表;節(jié)點任務(wù)請求記錄,記錄發(fā)出該請求的節(jié)點以及該請求在這個節(jié)點從當前時刻往后所有請求中的次序;最后根據(jù)步驟3)中確定的系統(tǒng)任務(wù)請求序列Rm,其中的第j個請求Rm(j)=tik由節(jié)點i在tik時刻發(fā)出,且該請求是節(jié)點i的第k個請求;通過遍歷任務(wù)請求序列Rm,對系統(tǒng)中出現(xiàn)的第j個任務(wù)請求,從節(jié)點i 的本地Map任務(wù)列表中第k個任務(wù)task(i,k)開始,查找第一個可調(diào)度的本地Map任務(wù);判斷可調(diào)度的本地Map任務(wù)依據(jù)是
7)task(i,k)不為空;
8) allocate[task(i;k). id] = =_1,即該任務(wù)沒有被調(diào)度器分配給其他的節(jié)點;
當task(i,k+m|m>cl)滿足任務(wù)本地性時,設(shè)置相應(yīng)任務(wù)的分配記錄 allocate [task(i;k). id]=i,結(jié)束對第j個任務(wù)請求的分析;否則當task(i,k+m|m >不為空,將task(i,k+m|m>cl)添加到該節(jié)點的可交換任務(wù)隊列中,判斷下一個本地Map任務(wù) task(i;k+m+1|m&0);當task(i;k+m|m&0)為空時,根據(jù)節(jié)點i及其交換任務(wù)隊列構(gòu)建待平衡節(jié)點對象BalanceNode并記錄在待平衡節(jié)點列表中。
進一步的,上述步驟5)具體過程是對于每一個未分配的任務(wù)task,獲取其數(shù)據(jù)塊副本存儲節(jié)點集,將數(shù)據(jù)塊副本存儲節(jié)點集中的節(jié)點和任務(wù)按〈Node,List<Task>>的形式放入映射表中,同一 node在List〈Task>尾部添加task ;在獲取所有數(shù)據(jù)塊源節(jié)點后,對于待平衡節(jié)點列表中的每一個待平衡節(jié)點,通過遍歷映射表,找到第一個與待平衡節(jié)點位于同一機架內(nèi)的數(shù)據(jù)塊源節(jié)點;構(gòu)造數(shù)據(jù)塊移動請求并提交;判斷兩個節(jié)點位于同一機架內(nèi)的依據(jù)是二者的節(jié)點名前綴一致;當無法找到與待平衡節(jié)點位于同一個機架內(nèi)的數(shù)據(jù)塊源節(jié)點時,選擇映射表中第一個數(shù)據(jù)塊源節(jié)點。
本發(fā)明的有益效果是
本發(fā)明針對Hadoop作業(yè)在Map階段運行過程中不同節(jié)點處理數(shù)據(jù)塊的差異,通過移動數(shù)據(jù)塊使得數(shù)據(jù)塊分布更符合各個節(jié)點性能,不僅可以減少后續(xù)運行在該數(shù)據(jù)集上類似作業(yè)的非本地Map任務(wù)分配,提高Map任務(wù)本地性,促進各個節(jié)點在Map階段任務(wù)執(zhí)行平衡,而且也能改善當前運行作業(yè)在Map階段后續(xù)過程中的任務(wù)平衡。在Hadoop Map階段, 各個Map任務(wù)的執(zhí)行彼此間是完全獨立的。各個Map任務(wù)在處理本地Map任務(wù)時,僅需要從本地磁盤上獲取數(shù)據(jù),除向JobTracker節(jié)點報告自身處理進度外幾乎不需要任何網(wǎng)絡(luò)通信。因此,在節(jié)點處理本地Map任務(wù)時,移動數(shù)據(jù)塊對整個網(wǎng)絡(luò)造成的壓力較小。
圖I是節(jié)點任務(wù)分配分析過程類圖2是節(jié)點任我分配分析流程圖3是待平衡節(jié)點與待分配任務(wù)匹配圖4是數(shù)據(jù)塊移動節(jié)點對匹配流程圖5是數(shù)據(jù)塊移動線程池框架;
圖6是數(shù)據(jù)塊移動線程池類圖7是節(jié)點間數(shù)據(jù)塊移動。
具體實施方式
下面結(jié)合附圖對本發(fā)明作詳細描述。
基于運行時數(shù)據(jù)塊移動的HDFS數(shù)據(jù)塊平衡策略,其具體實現(xiàn)步驟如下
第一步,節(jié)點本地任務(wù)列表預(yù)處理。對各個節(jié)點的本地任務(wù)列表進行預(yù)處理,將其劃分為完全本地任務(wù)部分和非完全本地任務(wù)部分。所有節(jié)點的完全本地任務(wù)部分實現(xiàn)了對輸入數(shù)據(jù)集的一個完整處理,且彼此間沒有任務(wù)交集。理想情況下,如果各個節(jié)點同時分配完完全本地任務(wù),則HDFS數(shù)據(jù)塊分布是符合調(diào)度器對各個節(jié)點的分配,即HDFS數(shù)據(jù)塊放置是均衡的。此時可通過預(yù)測節(jié)點未來的任務(wù)請求來確定沖突任務(wù)分配,并以此判斷可能出現(xiàn)的非本地任務(wù)分配,為平衡HDFS數(shù)據(jù)塊放置提供可靠的依據(jù)。對節(jié)點本地任務(wù)列表的預(yù)處理采用模擬JobTracker調(diào)度分配任務(wù)過程。各個節(jié)點任務(wù)處理速率相同,當各個節(jié)點將依次發(fā)出任務(wù)請求,預(yù)處理過程響應(yīng)節(jié)點請求,從節(jié)點的本地任務(wù)列表中獲取當前可執(zhí)行的任務(wù)加入到節(jié)點的完全本地任務(wù)列表中,而本地任務(wù)列表中未被分配的任務(wù)則加入到非完全本地任務(wù)列表中??蓤?zhí)行的本地任務(wù)即該任務(wù)還未有在其他副本存儲節(jié)點上執(zhí)行。
第二步,節(jié)點運行時信息統(tǒng)計。本發(fā)明在系統(tǒng)設(shè)計中采用NodeEvaluateInfo類表示,在該類中統(tǒng)計節(jié)點已經(jīng)處理的數(shù)據(jù)塊總數(shù)sum、節(jié)點已處理數(shù)據(jù)塊總耗時cost和作業(yè)的執(zhí)行進度tip,知道以上信息后可以計算節(jié)點平均塊處理時間cost/sum、節(jié)點當前運行任務(wù)剩余時間(1-tip) / (cost/sum);
第三步,節(jié)點速率評估與任務(wù)請求序列預(yù)測。I)節(jié)點速率評估。本發(fā)明提出一種節(jié)點速率評估方案,利用前面收集到的節(jié)點統(tǒng)計信息,采用COSIVNUMi來表示各個節(jié)點的數(shù)據(jù)處理速率,即節(jié)點處理單個任務(wù)的平均耗時。其中,NUMiS某一時刻節(jié)點i已完成的本地map任務(wù)數(shù),COSTi為處理這些本地任務(wù)所花費的總耗時;2)系統(tǒng)任務(wù)請求序列預(yù)測。系統(tǒng)任務(wù)請求序列即從當前時刻開始到作業(yè)完成時為止,各個從節(jié)點向主節(jié)點申請任務(wù)執(zhí)行的時刻序列。理論上講,該序列只有在作業(yè)完成后才可準確獲知,在作業(yè)運行過程中可以基于節(jié)點數(shù)據(jù)處理速率和節(jié)點當前處理任務(wù)的進度進行預(yù)測;假設(shè)在Ttl時刻,節(jié)點i正處理任務(wù)的進度為Pi,通過前面速率評估公式得到的節(jié)點處理單個數(shù)據(jù)塊平均耗時為Ti,則該節(jié)點的第K次任務(wù)請求時間點tik為
T0+(I-Pi) XTi+(k-1) XTi k 彡 I
其中k表示從當前時刻算起該節(jié)點第k次任務(wù)請求。
獲取各個節(jié)點的任務(wù)請求序列后,可以采用如下方式確定系統(tǒng)任務(wù)請求序列。
記系統(tǒng)剩余任務(wù)數(shù)為m,系統(tǒng)中節(jié)點數(shù)為η,對每個節(jié)點i,取其從當前時刻算起m次任務(wù)請求的時間點,記為{tn, ti2,…tim}, η個節(jié)點將構(gòu)成nXm個時間點{tn, t!2,· · · t]_m,七21,七22, ^2m · · ·, tnl, tn2, -U。將所有時間點按升序排列,取前m個,則可得到從當前時刻開始對系統(tǒng)中剩余m個任務(wù)的請求序列Rm. Rm(j)=tik即表明系統(tǒng)中第j個任務(wù)請求將由節(jié)點i在tik時刻發(fā)出,且該請求是節(jié)點i的第k個請求。
此過程的形式化描述為已知整數(shù)序列A= {a” a2, · · · aj,B=Ib1, b2, -bj,構(gòu)造整數(shù)集合C=Ici I Cfadl^bi, k彡ο},求升序排列C的前m個有序數(shù)。
第四步,節(jié)點任務(wù)分配分析。
I)節(jié)點任務(wù)分配過程設(shè)計。節(jié)點任務(wù)分配分析過程實質(zhì)上是模擬Hadoop調(diào)度器在當前預(yù)測的系統(tǒng)任務(wù)請求序列Rm下的響應(yīng)過程。依據(jù)各個節(jié)點的請求時機以及系統(tǒng)當前任務(wù)分配情況,確定對該請求的任務(wù)分配響應(yīng)并判斷該任務(wù)分配是否滿足任務(wù)本地性。當某個節(jié)點的任務(wù)請求不能得到本地Map任務(wù)分配響應(yīng)時,該節(jié)點即為待平衡節(jié)點。節(jié)點任務(wù)分配相關(guān)類圖如圖I所示。節(jié)點任務(wù)請求記錄NodeRequest。節(jié)點任務(wù)分配分析是模擬 Hadoop任務(wù)調(diào)度器在當前預(yù)測的系統(tǒng)任務(wù)請求序列下的響應(yīng)過程,而NodeRequest則描述模擬過程中的一個節(jié)點任務(wù)請求,其中主要記錄了發(fā)出該請求的節(jié)點,以及該請求在這個節(jié)點從當前時刻往后所有請求中的次序。
2)節(jié)點任務(wù)分配過程實現(xiàn)。節(jié)點任務(wù)分配分析是在預(yù)測的節(jié)點請求序列下提前確定各個節(jié)點的任務(wù)分配情形,其具體流程如錯誤!未找到引用源。2所示。根據(jù)前面的描述,系統(tǒng)任務(wù)請求序列Rm中的第j個請求Rm (j) =tik由節(jié)點i在tik時刻發(fā)出,且該請求是節(jié)點i的第k個請求。通過遍歷任務(wù)請求序列Rm,對系統(tǒng)中出現(xiàn)的第j個任務(wù)請求,從節(jié)點i 的本地Map任務(wù)列表中第k個任務(wù)task(i,k)開始,查找第一個可調(diào)度的本地Map任務(wù)。判斷可調(diào)度的本地Map任務(wù)依據(jù)是
(I) task(i k)不為空;
(2) allocate[task(i;k). id]==_l,即該任務(wù)沒有被調(diào)度器分配給其他的節(jié)點。當 task(i;k+m|m&0)滿足任務(wù)本地性時,設(shè)置相應(yīng)任務(wù)的分配記錄allocate[task(i,k). id]=i,結(jié)束對第j個任務(wù)請求的分析。否則當task(i,k+m|m>(l)不為空,將task(i,k+m|m>(l)添加到該節(jié)點的可交換任務(wù)隊列中,判斷下一個本地Map任務(wù)task(i,k+m+l|m>(l)。當task(i,k+m|m>(l)為空時, 根據(jù)節(jié)點i及其交換任務(wù)隊列構(gòu)建待平衡節(jié)點對象BalanceNode并記錄在待平衡節(jié)點列表中。完成全部任務(wù)請求的分析后,如果HDFS數(shù)據(jù)塊放置不均衡,則待平衡節(jié)點列表不空且 allocate數(shù)組中部分任務(wù)分配記錄仍為_1。此時待平衡節(jié)點個數(shù)與allocate數(shù)組中未分配項數(shù)目相同,且未分配的任務(wù)不是任何一個待平衡節(jié)點上的本地Map任務(wù),否則在前面的節(jié)點任務(wù)分配過程中必定會有節(jié)點被分配該任務(wù)。
第五步,數(shù)據(jù)塊移動節(jié)點對選擇。在完成節(jié)點任務(wù)分配分析后便可在待平衡節(jié)點和未分配任務(wù)輸入數(shù)據(jù)塊所在的存儲節(jié)點間移動數(shù)據(jù)塊。確定數(shù)據(jù)塊源節(jié)點與移動數(shù)據(jù)塊的過程如圖3所示。在選擇匹配待平衡節(jié)點與未分配任務(wù)時要有所約束和限制的。(I)交換節(jié)點是在未分配任務(wù)的多個副本數(shù)據(jù)塊的存儲節(jié)點中選擇。為減少通信開銷,優(yōu)先選擇與待平衡節(jié)點在同一個機架內(nèi)的副本存儲節(jié)點;(2)應(yīng)盡可能的避免多個待平衡節(jié)點與同一個數(shù)據(jù)塊存儲節(jié)點間進行數(shù)據(jù)塊傳輸。
為加快節(jié)點間的匹配過程,本發(fā)明采用貪心算法,首先解析出所有未分配任務(wù)的數(shù)據(jù)塊存儲節(jié)點,隨后在待平衡節(jié)點集合和存儲節(jié)點集之間查找可能的匹配組合,一旦發(fā)現(xiàn)某對待平衡節(jié)點與未分配任務(wù)數(shù)據(jù)塊存儲節(jié)點之間滿足前面的約束條件,便確定 二者的匹配關(guān)系,不再查找其他可能的更優(yōu)匹配結(jié)果。此過程的算法時間復(fù)雜度為O (N),其中N為待平衡節(jié)點數(shù)。具體的節(jié)點匹配過程如錯誤!未找到引用源。所示。
數(shù)據(jù)塊移動節(jié)點對選擇過程的第一步是遍歷al locate數(shù)組,構(gòu)建映射表 Map〈node, List〈Task>>,記錄所有數(shù)據(jù)塊源節(jié)點上的所有未分配任務(wù)。具體過程是對于每一個未分配的任務(wù)task,獲取其數(shù)據(jù)塊副本存儲節(jié)點集moveableNodes,將movableNodes 中的節(jié)點和task按〈Node, List〈Task>>的形式放入映射表nodeToTasks,同一 node在 List<Task> 尾部添加 task。
在實現(xiàn)中選擇java. util. LinkedHashMap作為nodeToTasks的類型。該類的基本特點是依據(jù)訪問順序?qū)τ成浔碇械逆I值對進行迭代,當訪問某一個鍵值對后,該鍵值對將放到鏈表的尾部。使用LinkedHashMap可以有效避免多個待平衡節(jié)點與同一個數(shù)據(jù)源節(jié)點之間進行數(shù)據(jù)塊移動。
在獲取所有數(shù)據(jù)塊源節(jié)點后,對于待平衡節(jié)點列表中的每一個待平衡節(jié)點,通過遍歷nodeToTasks,找到第一個與待平衡節(jié)點位于同一機架內(nèi)的數(shù)據(jù)塊源節(jié)點。構(gòu)造數(shù)據(jù)塊移動請求并提交。判斷兩個節(jié)點位于同一機架內(nèi)的依據(jù)是二者的節(jié)點名前綴一致,如節(jié)點 /rack-A/node01與節(jié)點/rack_A/node02位于同一機架內(nèi)。當無法找到與待平衡節(jié)點位于同一個機架內(nèi)的數(shù)據(jù)塊源節(jié)點時,選擇nodeToTask中第一個數(shù)據(jù)塊源節(jié)點。
第六步,節(jié)點間數(shù)據(jù)塊移動。確定好待平衡節(jié)點和數(shù)據(jù)塊源節(jié)點后便可進行實際的數(shù)據(jù)塊移動。由于數(shù)據(jù)塊移動與節(jié)點任務(wù)執(zhí)行相互獨立且考慮到可能有多個數(shù)據(jù)塊需要移動,為提高效率以及簡化編程實現(xiàn),采用JAVA線程池技術(shù)實現(xiàn)數(shù)據(jù)塊移動模塊,如錯誤! 未找到引用源。所示。每個數(shù)據(jù)塊移動任務(wù)等待線程池中空閑線程的調(diào)用執(zhí)行,任務(wù)執(zhí)行結(jié)束后,線程重返線程池,接受下一個任務(wù)的執(zhí)行。I)線程池設(shè)計。線程池相關(guān)類圖如圖6所示;2)數(shù)據(jù)塊移動任務(wù)。每一個任務(wù)對應(yīng)一份數(shù)據(jù)塊,根據(jù)待平衡節(jié)點的任務(wù)分配記錄,可依據(jù)任務(wù)編號解析出對應(yīng)數(shù)據(jù)塊并選擇本地Map任務(wù)列表中索引最大的節(jié)點作為目的節(jié)點。每個數(shù)據(jù)塊移動請求都封裝成一個MoveTask類,其中包含了需要移動的數(shù)據(jù)塊Block以及數(shù)據(jù)塊源節(jié)點和目的節(jié)點BalanceNode。數(shù)據(jù)塊移動任務(wù)Transfer通過實現(xiàn)java. lang. Runnable接口,在run O方法中實現(xiàn)數(shù)據(jù)塊移動邏輯。其流程圖如圖7所示。
對每一個數(shù)據(jù)塊移動請求,Tracnsfer從中解析出數(shù)據(jù)塊對象以及數(shù)據(jù)塊源節(jié)點和目的節(jié)點,向目的節(jié)點發(fā)送數(shù)據(jù)塊置換指令0P_REPLACE_BL0CK,由目的節(jié)點向源節(jié)點發(fā)送0P_C0PY_BL0CK指令并完成數(shù)據(jù)塊的傳輸。數(shù)據(jù)塊拷貝成功后,目的節(jié)點通知NameNode 刪除源節(jié)點上該數(shù)據(jù)塊的拷貝。
權(quán)利要求
1. 一種HDFS運行時數(shù)據(jù)塊平衡方法,其特征在于,包括以下步驟1)節(jié)點本地任務(wù)列表預(yù)處理I. I提出完全本地任務(wù)和非完全本地任務(wù)當HDFS的各個數(shù)據(jù)塊存在多個副本的時候,導(dǎo)致同一個任務(wù)會出現(xiàn)在不同節(jié)點的本地Map任務(wù)列表中,從而某個節(jié)點本地任務(wù)列表中剩余的map任務(wù)數(shù)η,意味著該節(jié)點能夠分配執(zhí)行的本地任務(wù)數(shù)是η ;1.2節(jié)點本地任務(wù)列表的預(yù)處理過程當各個節(jié)點依次發(fā)出任務(wù)請求時,從節(jié)點的本地任務(wù)列表中獲取當前可執(zhí)行的任務(wù)加入到節(jié)點的完全本地任務(wù)列表中,而本地任務(wù)列表中未被分配的任務(wù)則加入到非完全本地任務(wù)列表中;2)節(jié)點運行時信息統(tǒng)計通過設(shè)計NodeEvaluateInfo類來實現(xiàn)在該類中統(tǒng)計節(jié)點已經(jīng)處理的數(shù)據(jù)塊總數(shù) sum、節(jié)點已處理數(shù)據(jù)塊總耗時cost和作業(yè)的執(zhí)行進度tip,知道以上信息后計算節(jié)點平均塊處理時間cost/sum、節(jié)點當前運行任務(wù)剩余時間(1-tip) / (cost/sum);3)節(jié)點速率評估與任務(wù)請求序列預(yù)測3. I節(jié)點速率的評估由步驟2),采用COSIVNUMi來表示各個節(jié)點的數(shù)據(jù)處理速率,即節(jié)點處理單個任務(wù)的平均耗時;其中,NUMi為某一時刻節(jié)點i已完成的本地map任務(wù)數(shù), COSTi為處理這些本地任務(wù)所花費的總耗時;3. 2系統(tǒng)任務(wù)請求序列的預(yù)測系統(tǒng)任務(wù)請求序列即從當前時刻開始到作業(yè)完成時為止,各個從節(jié)點向主節(jié)點申請任務(wù)執(zhí)行的時刻序列;在Ttl時刻,節(jié)點i正處理任務(wù)的進度為 Pi,通過前面速率評估公式得到的節(jié)點處理單個數(shù)據(jù)塊平均耗時為Ti,則該節(jié)點的第K次任務(wù)請求時間點 tik 為 V(I-Pi) XTi+(k-l) XTi k ^ I ;其中k表示從當前時刻算起該節(jié)點第k次任務(wù)請求;獲取各個節(jié)點的任務(wù)請求序列后, 采用如下方式確定系統(tǒng)任務(wù)請求序列記系統(tǒng)剩余任務(wù)數(shù)為m,系統(tǒng)中節(jié)點數(shù)為n,對每個節(jié)點i,取其從當前時刻算起m次任務(wù)請求的時間點,記為{tn, ti2,…tim}, η個節(jié)點將構(gòu)成 nXm個時間點{tn,七12,…t!m,七21,七22,… t2m>…,tnl, tn2, *·· t*};將所有時間點按升序排列, 取前m個,則可得到從當前時刻開始對系統(tǒng)中剩余m個任務(wù)的請求序列Rm. Rm(j)=tik即表明系統(tǒng)中第j個任務(wù)請求將由節(jié)點i在tik時刻發(fā)出,且該請求是節(jié)點i的第k個請求;4)節(jié)點任務(wù)的分配分析與實現(xiàn)在步驟3)預(yù)測的節(jié)點請求序列下提前確定各個節(jié)點的任務(wù)分配情況;5)數(shù)據(jù)塊移動節(jié)點對的選擇從任務(wù)請求序列中獲取發(fā)出請求的節(jié)點,接著從該節(jié)點的本地任務(wù)列表中獲取任務(wù),如果任務(wù)為空,則認定該節(jié)點是待平衡節(jié)點,將其加入到待平衡節(jié)點列表中;數(shù)據(jù)塊移動節(jié)點對選擇過程的第一步是遍歷allocate數(shù)組,構(gòu)建映射表 Map〈node, List〈Task>>,記錄所有數(shù)據(jù)塊源節(jié)點上的所有未分配任務(wù);6)節(jié)點間數(shù)據(jù)塊的移動確定好待平衡節(jié)點和數(shù)據(jù)塊源節(jié)點后便可進行實際的數(shù)據(jù)塊移動;由于數(shù)據(jù)塊移動與節(jié)點任務(wù)執(zhí)行相互獨立且考慮到可能有多個數(shù)據(jù)塊需要移動,為提高效率以及簡化編程實現(xiàn),采用JAVA線程池技術(shù)實現(xiàn)整個數(shù)據(jù)塊移動。
2.根據(jù)權(quán)利要求I所述的HDFS運行時數(shù)據(jù)塊平衡方法,其特征在于,步驟4)中,模擬 Hadoop調(diào)度器在當前預(yù)測的系統(tǒng)任務(wù)請求序列Rm下的響應(yīng)過程;依據(jù)各個節(jié)點的請求時機以及系統(tǒng)當前任務(wù)分配情況,確定對該請求的任務(wù)分配響應(yīng)并判斷該任務(wù)分配是否滿足任務(wù)本地性;確定任務(wù)的分配記錄通過AllocatedRecord類實現(xiàn),該類通過記錄任務(wù)的分配標志、分配給的節(jié)點編號、分配的時間和該任務(wù)對應(yīng)的數(shù)據(jù)塊是否已加入代交換列表;節(jié)點任務(wù)請求記錄,記錄發(fā)出該請求的節(jié)點以及該請求在這個節(jié)點從當前時刻往后所有請求中的次序;最后根據(jù)步驟3)中確定的系統(tǒng)任務(wù)請求序列Rni,其中的第j個請求Rjjktik由節(jié)點i在tik時刻發(fā)出,且該請求是節(jié)點i的第k個請求;通過遍歷任務(wù)請求序列Rm,對系統(tǒng)中出現(xiàn)的第j個任務(wù)請求,從節(jié)點i的本地Map任務(wù)列表中第k個任務(wù)task(i,k)開始,查找第一個可調(diào)度的本地Map任務(wù);判斷可調(diào)度的本地Map任務(wù)依據(jù)是a)task(i,k)不為空;b)allocate[task(i;k).id]==_l,即該任務(wù)沒有被調(diào)度器分配給其他的節(jié)點;當task(i,k+m|m>(l)滿足任務(wù)本地性時,設(shè)置相應(yīng)任務(wù)的分配記錄allocate [task(i,k). id] =i,結(jié)束對第j個任務(wù)請求的分析;否則當task(i,k+m|m>(l)不為空,將task(i,k+m|m>(l)添加到該節(jié)點的可交換任務(wù)隊列中,判斷下一個本地Map任務(wù)task(i,k+m+l|m>(l);當task(i;k+m|m&0) 為空時,根據(jù)節(jié)點i及其交換任務(wù)隊列構(gòu)建待平衡節(jié)點對象BalanceNode并記錄在待平衡節(jié)點列表中。
3.根據(jù)權(quán)利要求I或2所述的HDFS運行時數(shù)據(jù)塊平衡方法,其特征在于,步驟5)具體過程是對于每一個未分配的任務(wù)task,獲取其數(shù)據(jù)塊副本存儲節(jié)點集,將數(shù)據(jù)塊副本存儲節(jié)點集中的節(jié)點和任務(wù)按〈Node, List〈Task>>的形式放入映射表中,同一 node在 List<Task>尾部添加task ;在獲取所有數(shù)據(jù)塊源節(jié)點后,對于待平衡節(jié)點列表中的每一個待平衡節(jié)點,通過遍歷映射表,找到第一個與待平衡節(jié)點位于同一機架內(nèi)的數(shù)據(jù)塊源節(jié)點; 構(gòu)造數(shù)據(jù)塊移動請求并提交;判斷兩個節(jié)點位于同一機架內(nèi)的依據(jù)是二者的節(jié)點名前綴一致;當無法找到與待平衡節(jié)點位于同一個機架內(nèi)的數(shù)據(jù)塊源節(jié)點時,選擇映射表中第一個數(shù)據(jù)塊源節(jié)點。
全文摘要
本發(fā)明公開了一種HDFS運行時數(shù)據(jù)塊平衡方法,該方法首先對節(jié)點本地任務(wù)列表進行預(yù)處理,為每一個節(jié)點劃分出完成本地任務(wù)和非完全本地任務(wù),以提供啟動HDFS數(shù)據(jù)塊平衡判斷的依據(jù)。接著對各個節(jié)點的運行速率就行評估和任務(wù)請求預(yù)測。完成以上步驟之后對各個節(jié)點的分配過程進行設(shè)計和實現(xiàn)。之后選擇合適的節(jié)點間進行數(shù)據(jù)塊的移動,從而數(shù)據(jù)塊的分布就可以匹配預(yù)測的節(jié)點任務(wù)請求序列,最終達到數(shù)據(jù)塊平衡的目的。本發(fā)明提出基于運行時數(shù)據(jù)塊移動HDFS平衡策略,通過預(yù)測節(jié)點任務(wù)請求提前判斷可能出現(xiàn)的非本地map任務(wù)執(zhí)行,并在相應(yīng)的節(jié)點間移動合適的數(shù)據(jù)塊,使得節(jié)點發(fā)出實際任務(wù)請求時候能夠得到本地map任務(wù)的分配響應(yīng),從而提高Map階段的完成效率。
文檔編號G06F17/30GK102937918SQ20121039317
公開日2013年2月20日 申請日期2012年10月16日 優(yōu)先權(quán)日2012年10月16日
發(fā)明者曹海軍, 伍衛(wèi)國, 董小社, 樊源泉, 魏偉, 朱霍 申請人:西安交通大學(xué)