本發(fā)明涉及大數(shù)據(jù)處理技術(shù)領(lǐng)域,特別涉及一種針對(duì)非易失性內(nèi)存的shuffle方法。
背景技術(shù):
隨著科學(xué)技術(shù)的發(fā)展,當(dāng)今世界已進(jìn)入大數(shù)據(jù)時(shí)代,mapreduce是當(dāng)下流行的一種用于大規(guī)模數(shù)據(jù)并行運(yùn)算的編程模型,如何優(yōu)化mapreduce的性能一直是業(yè)界熱點(diǎn)。
shuffle是mapreduce框架中,介于map階段和reduce階段之間的一個(gè)特定的階段,圖1是mapreduce流程示意圖,如圖1所示,shuffle是指當(dāng)map的輸出結(jié)果要被reduce使用時(shí),輸出結(jié)果按key哈希,并且分發(fā)到每一個(gè)reduce上的過程,其中,shuffle涉及了磁盤的讀寫和網(wǎng)絡(luò)的傳輸,因此shuffle性能的高低直接影響到了整個(gè)程序的運(yùn)行效率。
現(xiàn)有技術(shù)中,針對(duì)shuffle階段的優(yōu)化主要有以下方法:
themis發(fā)表在proceedingsofthe3rdacmsymposiumoncloudcomputing(socc),2012上的文章,提出在shuffle階段使用動(dòng)態(tài)內(nèi)存分配策略對(duì)該過程中的數(shù)據(jù)進(jìn)行存儲(chǔ),即作業(yè)在處理數(shù)據(jù)的過程中,數(shù)據(jù)從磁盤的讀寫次數(shù)只有兩次,其余過程都不會(huì)與磁盤交互;spongefiles發(fā)表在proceedingsofthe2014acmsigmodinternationalconferenceonmanagementofdata上的文章,提出共享task中未使用的內(nèi)存空間,以上兩種方法僅通過內(nèi)存進(jìn)行加速,對(duì)內(nèi)存性能要求較高;
另外,sailfish發(fā)表在proceedingsofthe3rdacmsymposiumoncloudcomputing(socc),2012上的文章,提出在寫shuffle數(shù)據(jù)時(shí),聚集每個(gè)maptask相對(duì)應(yīng)的分區(qū)的數(shù)據(jù),利用分布式文件系統(tǒng)來存儲(chǔ)相應(yīng)的數(shù)據(jù);hadoop-a發(fā)表在proceedingsofthe2011internationalconferenceforhighperformancecomputing,networking,storageandanalysis上的文章,提出利用高速網(wǎng)絡(luò)(rdma)的特性,使用network-levitatedmerge算法來執(zhí)行shuffle階段,但以上兩種方法的缺陷在于過于依賴網(wǎng)絡(luò)性能,并且采用文件系統(tǒng)的方式進(jìn)行數(shù)據(jù)的存取的時(shí)間開銷較大。
因此,目前需要一種時(shí)間開銷小且內(nèi)存利用率高的shuffle優(yōu)化方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種針對(duì)非易失性內(nèi)存的shuffle方法,該方法能夠克服上述現(xiàn)有技術(shù)的缺陷,具體包括以下步驟:
步驟1)、利用分區(qū)id將map任務(wù)的輸出數(shù)據(jù)分別寫入持久化緩沖區(qū);
步驟2)、拉取reduce任務(wù)對(duì)應(yīng)的所述持久化緩沖區(qū)中的數(shù)據(jù)。
優(yōu)選的,所述步驟1)中,每個(gè)map任務(wù)的每個(gè)分區(qū)id分別對(duì)應(yīng)一個(gè)私有持久化緩沖區(qū)。
優(yōu)選的,所述步驟1)進(jìn)一步包括:在數(shù)據(jù)寫入時(shí),判斷對(duì)應(yīng)的所述私有持久化緩沖區(qū)是否存在;如不存在,申請(qǐng)新的所述私有持久化緩沖區(qū);否則執(zhí)行數(shù)據(jù)寫入當(dāng)前私有持久化緩沖區(qū)。
優(yōu)選的,利用所述私有化緩沖區(qū)與分區(qū)id之間的關(guān)聯(lián)判斷所述私有持久化緩沖區(qū)是否存在。
優(yōu)選的,所述步驟1)進(jìn)一步包括:在執(zhí)行數(shù)據(jù)寫入所述當(dāng)前私有持久化緩沖區(qū)時(shí),判斷所述當(dāng)前私有緩沖區(qū)是否滿足數(shù)據(jù)大小,如滿足,則執(zhí)行數(shù)據(jù)寫入,否則申請(qǐng)新的所述私有持久化緩沖區(qū)。
優(yōu)選的,當(dāng)一個(gè)私有持久化緩沖區(qū)寫滿時(shí),記錄所述私有化緩沖區(qū)及關(guān)聯(lián)的分區(qū)id,從而在每個(gè)map任務(wù)的輸出數(shù)據(jù)寫入完成后,建立與所述map任務(wù)關(guān)聯(lián)的映射表。
優(yōu)選的,所述步驟2)進(jìn)一步包括利用所述映射表執(zhí)行數(shù)據(jù)拉取。
根據(jù)本發(fā)明的另一方面,還提供一種mapreduce編程方法,包括采用上述針對(duì)非易失性內(nèi)存的shuffle方法。
根據(jù)本發(fā)明的另一方面,還提供一種計(jì)算機(jī)系統(tǒng),包括存儲(chǔ)器、處理器及存儲(chǔ)在存儲(chǔ)器上并可在處理器上運(yùn)行的計(jì)算機(jī)程序,其中,所述處理器運(yùn)行所述程序時(shí)執(zhí)行如上所述的步驟。
根據(jù)本發(fā)明的另一方面,還提供一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),包括存儲(chǔ)在所述可讀存儲(chǔ)介質(zhì)上的計(jì)算機(jī)程序,其中,所述程序執(zhí)行如上所述的步驟。
相對(duì)于現(xiàn)有技術(shù),本發(fā)明取得了如下有益技術(shù)效果:本發(fā)明提供的針對(duì)非易失性內(nèi)存的shuffle方法,利用nvm的特點(diǎn),為大數(shù)據(jù)平臺(tái)提供了java的持久化內(nèi)存訪問接口,使其能夠直接使用與訪問nvm;同時(shí)采用延遲分配策略將數(shù)據(jù)寫入基于哈希的私有持久化緩沖區(qū),一方面提升了nvm的空間利用率,另一方面提高了處理并發(fā)的效率;并且采用了映射表對(duì)nvm緩沖區(qū)進(jìn)行管理,實(shí)現(xiàn)了數(shù)據(jù)讀取階段的快速定位。
附圖說明
圖1是mapreduce流程示意圖。
圖2是shuffle數(shù)據(jù)量對(duì)于sort執(zhí)行時(shí)間的影響曲線圖。
圖3是本發(fā)明提供的基于非易失內(nèi)存的shuffle方法的架構(gòu)圖。
圖4是本發(fā)明提供的基于哈希的私有持久化緩沖區(qū)劃分示意圖。
圖5是本發(fā)明提供的延遲分配流程圖。
圖6是本發(fā)明提供的nvm緩沖區(qū)的讀取示意圖。
圖7是本發(fā)明提供的映射表管理nvm緩沖區(qū)示意圖
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案以及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖,對(duì)根據(jù)本發(fā)明的實(shí)施例中提供的針對(duì)非易失性內(nèi)存的shuffle方法進(jìn)行說明。
為了研究shuffle性能對(duì)于整體性能的影響,發(fā)明人以sort應(yīng)用為例,評(píng)測了該應(yīng)用在spark上的運(yùn)行時(shí)間隨著shuffle數(shù)據(jù)量的變化的結(jié)果。
圖2是shuffle數(shù)據(jù)量對(duì)于sort執(zhí)行時(shí)間的影響曲線圖,如圖2所示,隨著shuffle數(shù)據(jù)量的增大,spark的性能大幅度地下降。這是由于在執(zhí)行map任務(wù)與reduce任務(wù)之間的數(shù)據(jù)讀取時(shí),數(shù)據(jù)是進(jìn)行分區(qū)的,因此對(duì)于某一個(gè)reduce任務(wù)而言,從一個(gè)map任務(wù)中讀取的數(shù)據(jù)量是與reduce任務(wù)總數(shù)量成反比,這會(huì)導(dǎo)致大量的小粒度和隨機(jī)讀,極易造成磁盤性能的下降,影響作業(yè)的執(zhí)行時(shí)間。所以i/o開銷是影響shuffle性能的一個(gè)重要因素,尤其是對(duì)基于內(nèi)存計(jì)算的大數(shù)據(jù)處理平臺(tái),例如spark,shuffle階段的i/o開銷可能大大延長數(shù)據(jù)處理的時(shí)間。
為了優(yōu)化shuffle階段的讀寫性能,以便緩解i/o性能瓶頸,發(fā)明人發(fā)現(xiàn)非易失性內(nèi)存(non-volatilememory,nvm)在內(nèi)存計(jì)算的場景下有著廣泛的應(yīng)用場景。nvm是一種斷電時(shí)其內(nèi)容仍能保持的非易失、可持久化的內(nèi)存。nvm有著與dram相接近的讀寫延遲和吞吐率,但nvm的存儲(chǔ)密度比dram更大,與nandflashssd相似。但是對(duì)于nvm現(xiàn)有的系統(tǒng)軟件,例如nvm文件系統(tǒng),其開銷過高,不能充分發(fā)揮nvm的性能,針對(duì)上述問題,發(fā)明人經(jīng)研究,提出了一種高效使用nvm來提升shuffle階段的i/o性能的方法。
在本發(fā)明的一個(gè)實(shí)施例中,提供一種針對(duì)非易失性內(nèi)存的shuffle方法,該方法采用持久化內(nèi)存的方式,直接在用戶態(tài)訪問持久化內(nèi)存。
圖3是本發(fā)明提供的基于非易失內(nèi)存的shuffle方法的架構(gòu)圖,如圖3所示,本發(fā)明的針對(duì)非易失性內(nèi)存的shuffle方法通過建立作為java的持久化內(nèi)存訪問接口的nv-shuffle接口,使大數(shù)據(jù)平臺(tái)能夠直接使用與訪問nvm,具體包括以下步驟:
s10.將數(shù)據(jù)寫入緩沖區(qū)
當(dāng)map開始產(chǎn)生輸出時(shí),數(shù)據(jù)首先寫入到內(nèi)存中的緩沖區(qū)。發(fā)明人提出了一種將數(shù)據(jù)寫入基于哈希的私有持久化緩沖區(qū)的方法,即通過分區(qū)id和map任務(wù)對(duì)nvm緩沖區(qū)進(jìn)行區(qū)分,使每個(gè)map任務(wù)的每個(gè)分區(qū)id都對(duì)應(yīng)一個(gè)單獨(dú)的持久化緩沖區(qū)。例如,圖4是本發(fā)明提供的基于哈希的私有持久化緩沖區(qū)劃分示意圖,如圖4所示,在job執(zhí)行時(shí),maptask的個(gè)數(shù)是m,每個(gè)task在數(shù)據(jù)進(jìn)行partition后對(duì)應(yīng)有n個(gè)id,則可將nvm緩沖區(qū)相應(yīng)劃分為m*n個(gè)nv-buffer,使得m個(gè)task分別按n個(gè)id對(duì)應(yīng)單獨(dú)的持久化緩沖區(qū)。
通過采用上述方法,可以使任務(wù)在并發(fā)寫時(shí)沒有鎖競爭開銷,同時(shí)可以將各任務(wù)之間的數(shù)據(jù)利用私有持久化緩沖區(qū)完成隔離,當(dāng)部分任務(wù)數(shù)據(jù)失效時(shí),直接進(jìn)行刪除即可,不會(huì)影響其他任務(wù)的數(shù)據(jù)。
s20.采用延遲策略分配緩沖區(qū)
在執(zhí)行步驟s10,將每個(gè)map任務(wù)的輸出數(shù)據(jù)寫入私有持久化緩沖區(qū)時(shí),可以根據(jù)參數(shù),例如io.sort.mb,來設(shè)置緩沖區(qū)的大小。
為了有效的利用nvm緩沖區(qū)的存儲(chǔ)空間,發(fā)明人提出了一種延遲策略,圖5是本發(fā)明提供的延遲分配流程圖,如圖5所示,當(dāng)需要將一個(gè)map任務(wù)的輸出數(shù)據(jù),按分區(qū)id寫入其對(duì)應(yīng)的私有持久化緩沖區(qū)時(shí),首先需要判斷對(duì)應(yīng)的nv-buffer是否存在,如果不存在,則申請(qǐng)新的nv-buffer,進(jìn)行數(shù)據(jù)的寫入,其中,可以利用步驟s10在進(jìn)行劃分時(shí),私有化緩沖區(qū)與分區(qū)id之間的關(guān)聯(lián)判斷所述私有持久化緩沖區(qū)是否存在;如果存在,則判斷當(dāng)前nv-buffer的空間是否滿足數(shù)據(jù)大?。蝗绻粷M足,則申請(qǐng)新的nv-buffer,進(jìn)行數(shù)據(jù)的寫入;如果滿足,則將數(shù)據(jù)寫入到nv-buffer中。通過采用上述延遲的分配策略,能夠大幅度提升nvm緩沖區(qū)的空間利用率。
s30.利用映射表管理緩沖區(qū)
在利用s20的延遲策略為每個(gè)map任務(wù)的每個(gè)id都分配一個(gè)單獨(dú)的持久化緩沖區(qū)后,每個(gè)reduce任務(wù)將對(duì)map任務(wù)的輸出數(shù)據(jù)進(jìn)行讀取。由于reduce任務(wù)擁有多個(gè)線程,可以并行的獲取map輸出,同時(shí)reduce任務(wù)的輸入數(shù)據(jù)分布在集群內(nèi)的多個(gè)map任務(wù)的輸出中。發(fā)明人提出使用映射表方式來存儲(chǔ)步驟s10獲得的分區(qū)id與nvm緩沖區(qū)的對(duì)應(yīng)關(guān)系,以便在數(shù)據(jù)讀取過程中快速的定位。
例如,圖6是本發(fā)明提供的nvm緩沖區(qū)的讀取示意圖,如圖6所示,共有n'個(gè)reduce任務(wù)需要讀取與之對(duì)應(yīng)的數(shù)據(jù),由于這些數(shù)據(jù)是根據(jù)分區(qū)id進(jìn)行區(qū)分的,所以在讀取的過程中,一個(gè)分區(qū)id會(huì)對(duì)應(yīng)多個(gè)nv-buffer,例如,reducetask1'讀取map各task中的id為p1的數(shù)據(jù),reducetask2'讀取map各task中的id為p2的數(shù)據(jù)……reducetaskn'讀取map各task中的id為pn的數(shù)據(jù)。
為了提高reduce任務(wù)的讀取效率,發(fā)明人提出,在完成上述步驟s10,s20后,建立映射表以記錄記錄分區(qū)id與nv-buffer之間的對(duì)應(yīng)關(guān)系。例如,圖7是本發(fā)明提供的映射表管理nvm緩沖區(qū)示意圖,如圖7所示,為每個(gè)maptask分別建立一個(gè)映射表,當(dāng)該maptask所對(duì)應(yīng)的一個(gè)nv-buffer寫滿時(shí),將相應(yīng)的<分區(qū)id,nv-buffer>添加到上述映射表中,在該maptask執(zhí)行完成之后,將該映射表的內(nèi)容上傳到driver中;在reducetask拉取數(shù)據(jù)時(shí),可以先從driver處獲取表示分區(qū)id與nv-buffer之間的對(duì)應(yīng)關(guān)系的映射表,再依據(jù)其上記錄的位置信息進(jìn)行數(shù)據(jù)拉取。
通過采用映射表的方式對(duì)nvm緩沖區(qū)進(jìn)行管理,提高了定位速度,有利于讀取數(shù)據(jù),并且在出現(xiàn)故障之后能夠進(jìn)行快速的數(shù)據(jù)恢復(fù)。
相對(duì)于現(xiàn)有技術(shù),在本發(fā)明實(shí)施例中所提供的針對(duì)非易失性內(nèi)存的shuffle方法,充分利用了nvm的優(yōu)勢,提供一種java的持久化內(nèi)存訪問接口,即nv-shuffle接口,使大數(shù)據(jù)平臺(tái)能夠直接使用與訪問nvm;利用基于哈希的私有持久化緩沖區(qū)來組織shuffle階段的數(shù)據(jù),可以實(shí)現(xiàn)高效處理并發(fā)、錯(cuò)誤厝里、網(wǎng)絡(luò)傳輸?shù)确矫娴膯栴};同時(shí)采用了延遲分配策略提升nvm的空間利用率,以及映射表方式提高對(duì)緩沖區(qū)的管理。通過使用該方法能夠高效的利用nvm提升shuffle階段的i/o性能,尤其特別適用于shuffle階段的數(shù)據(jù)量大且所占的時(shí)間比例大的shuffle-heavy類型的負(fù)載,例如,sort負(fù)載。
雖然本發(fā)明已經(jīng)通過優(yōu)選實(shí)施例進(jìn)行了描述,然而本發(fā)明并非局限于這里所描述的實(shí)施例,在不脫離本發(fā)明范圍的情況下還包括所作出的各種改變以及變化。