本發(fā)明專利技術涉及一種MapReduce計算框架中的高性能排序方法。該方法在Map階段按照partition分別構建緩沖鏈,移除partition本身進行排序的需要,并且對于每一個partition數(shù)據(jù)將按照塊進行組織,降低了數(shù)據(jù)在內存中的拷貝以及文件IO方面的代價;在Map階段不執(zhí)行排序操作,在Reduce階段以一個較大的緩沖池作為一次排序的基本單位,使得在排序的歸并階段總的歸并路數(shù)是一個用戶可調優(yōu)的值。本發(fā)明專利技術通過一種混合的內存排序算法,優(yōu)化了MapReduce框架中排序的兩個階段,基本消除了排序對于計算框架的性能影響,進而提升了計算框架的資源有效性,降低了集群的整體資源消耗。
【技術實現(xiàn)步驟摘要】
本專利技術屬于信息
,涉及一種對分布式計算框架的優(yōu)化方法,特別涉及一種在MapReduce計算框架中提高排序性能的方法。
技術介紹
MapReduce是分布式計算中的一種標準框架,但在資源消耗方面,現(xiàn)有MapReduce框架并不高效,導致大量集群資源被浪費。現(xiàn)有MapReduce框架中需要對中間數(shù)據(jù)的key/value對進行排序,并且排序構成了現(xiàn)有計算框架中主要的資源消耗。我們以MapReduce的開源實現(xiàn)hadoop為例,說明上述問題。如圖1所示,為傳統(tǒng)MapReduce數(shù)據(jù)流程示意圖。其中Hadoop文件系統(tǒng)(簡稱HDFS,Hadoop File System)負責數(shù)據(jù)的分布式存儲。計算框架所執(zhí)行任務(Job)從HDFS讀入數(shù)據(jù)經(jīng)過處理后再寫入到HDFS。在計算框架內部分為Map和Reduce兩個階段,Map階段將HDFS上的數(shù)據(jù)執(zhí)行用戶自定義的Map函數(shù),然后對輸出的中間數(shù)據(jù)首先放入內存,然后排序后寫入本地磁盤。在Reduce階段,每個Reduce接收來自各個Map的排序后的中間數(shù)據(jù)然后進行歸并。框架對同一 key下的所有value調用用戶自定義的Reduce函數(shù)進行計算后寫入到HDFS。具體的數(shù)據(jù)流程可以參見圖1。在如圖1所示的原有的數(shù)據(jù)流程中,排序所需要的工作量3,5,7,8消耗了大部分的框架CPU資源。這種消耗又可以分為內存排序和多路歸并兩個階段。1、流程3中對中間數(shù)據(jù)進行基于內存的二級索引快速排序。排序的過程實際上是對16字節(jié)的索引進行排序,索引為一個四元組〈id, partition, key offset, valueoffset〉。當兩個這樣的四元組進行比較時首先比較兩條記錄的partition,構成一個partition 升序的序列。只有當 partition—致時再根據(jù)〈key offset, value offset〉找到對應的key進行字節(jié)比較。大量冗余的partition比較以及O(nlogn)復雜度的代價使得這一部分效率很低。2、流程5,7,8中對內存或磁盤上的有序數(shù)據(jù)進行多路歸并排序。由于在MapReduce計算框架中需要保證內存有限時對數(shù)據(jù)依舊可以處理,因此基于磁盤的歸并排序是框架必不可少的一部分。這一部分的算法實現(xiàn)的復雜度為O(nlogm),其中η為記錄數(shù)而m為歸并路數(shù)。由于整體所需要排序的記錄數(shù)固定,因此這一部分是否高效取決于歸并路數(shù),而歸并路數(shù)在現(xiàn)有實現(xiàn)中其最小值和map的數(shù)目相當。對于map數(shù)目較大的Job,這部分的代價會高于第一部分的代價并消耗大部分資源。因此,在現(xiàn)有MapReduce計算框架中進行排序的兩個階段因為算法的選擇或是處理流程上的不當導致都不高效,而排序操作又對于每一個Job都必不可少,造成了大量的資源浪費。
技術實現(xiàn)思路
本專利技術目的在于提出一種在MapReduce計算框架中進行的高性能排序方法,能夠降低框架整體的CPU資源消耗,提高集群整體有效利用率。本專利技術的,其步驟包括:1、Map Task從HDFS上讀取文件,構造輸入數(shù)據(jù)的key/value對;2、對輸入數(shù)據(jù)執(zhí)行用戶自定義Map函數(shù)并輸出中間結果的key/value對,并計算key所對應的partition ;對內存中每個partition設置對應的緩沖鏈,將中間結果的key/value對首先計算長度,然后插入到緩沖鏈中;3、當內存無法放下所有中間結果的key/value對時,按照partition的順序,輸出所有緩沖鏈到本地文件;4、對經(jīng)過上述步驟后在內存和本地磁盤上形成的一個或多個未排序的結果按照partition的順序進行歸并,輸出成一個完整的按照partition進行分段的本地文件;5、Reduce Task通過AppMaster獲得Map Task結束的信息,向負責該Map數(shù)據(jù)托管的進程發(fā)送http請求,拖取該Map輸出的中間數(shù)據(jù)中屬于該Reduce的部分,將這些數(shù)據(jù)根據(jù)其大小選擇放于內存或放于本地磁盤;6、將內存或磁盤中的中間數(shù)據(jù)讀入內存中的排序緩沖池,當排序緩沖池滿時,對整個緩沖池進行排序;7、對于中間數(shù)據(jù)無法全部放在一個排序緩沖池中的情況,在排序后將數(shù)據(jù)寫出到本地文件中。進一步地,上述方法還包括如下步驟:8、對內存和本地文件中的有序結果進行歸并,歸并結果作為用戶自定義Reduce函數(shù)的輸入;9、Reduce函數(shù)對相同key下的所有value執(zhí)行操作,生成輸出數(shù)據(jù)的key/value對并寫入HDFS。進一步地,步驟6)對于大多數(shù)作業(yè)使用的整形或者字符數(shù)組類型的key,抽取key中能夠保序的4字節(jié)作為低32位,和該條記錄本身4字節(jié)的二級索引作為高32位進行拼接,形成一個8字節(jié)的長整形作為新的key。更進一步地,在這個8字節(jié)上使用基數(shù)排序,使得其從key中抽取的4字節(jié)有序。更進一步地,獲取基數(shù)排序后的二級索引,再對其進行快速排序保證整體記錄的有序性。進一步地,步驟6)對于無法抽取保序4字節(jié)的key類型,構建二級索引,使用快速排序進行整體記錄的排序。其中,抽取key中4字節(jié)的方法是:對于整數(shù)即其本身;對于字符數(shù)組類型的key為其排序序列的前4個字節(jié),以整數(shù)對待,并在最高位取反。其中,基數(shù)排序算法為非遞歸版本,輸入為兩個長整形的數(shù)組,一個用于存放原始數(shù)據(jù),一個用于算法的臨時空間,算法執(zhí)行后的結果為長整形數(shù)組中低32位整形有序。其中,緩沖池的大小和原有實現(xiàn)(圖1所示方法)中的排序緩沖池的大小保持一致,需要用戶設定。本專利技術的有益效果如下:1、本專利技術在Map階段按照partition分別構建緩沖鏈,移除了 partition本身進行排序的需要,并且對于每一個partition數(shù)據(jù)將按照塊(block)進行組織,降低了數(shù)據(jù)在內存中的拷貝以及文件IO方面的代價。2、本專利技術在Map階段不執(zhí)行排序操作,使得Map階段的運行時間和CPU資源消耗大幅度下降,進而整體Map階段的結束時間提前,并且對于大多數(shù)作業(yè)的整體運行時間得到優(yōu)化。3、本專利技術在Reduce階段以一個較大的緩沖池作為一次排序的基本單位(例如128MB),使得在排序的歸并階段總的歸并路數(shù)是一個用戶可調優(yōu)的值。對于每個reduce處理數(shù)據(jù)量一定的情況,歸并路數(shù)為一個非常小的常數(shù)值(一般為I?4)。因此歸并階段的算法復雜度和消耗的資源都將減少。4、本專利技術通過一種混合的內存排序算法,能夠高效的對內存中變長記錄進行排序。基數(shù)排序算法復雜度低但不適合變長字段,快速排序適用性廣但算法復雜度高。結合MapReduce框架場景需要對大量變長的〈key,value)格式的數(shù)據(jù)進行排序,本專利技術首先通過低復雜度的基數(shù)排序將記錄的定長部分進行排序,然后對于少量無序的記錄再利用快速排序來保證結果的正確性。兩種算法的混合使得既能保證整體的低算法復雜度,又能保證對變長記錄的適用性,提高了整體的排序性能。因此,本專利技術優(yōu)化了 MapReduce框架中排序的兩個階段,使用高效的內存算法并且降低歸并路數(shù)使得整體的排序性能得到大幅度提升,基本消除了排序對于計算框架的性能影響,進而提升了計算框架的資源有效性,降低了集群的整體資源消耗。【附圖說明】圖1傳統(tǒng)MapReduce計算框架數(shù)據(jù)流程圖。圖2本專利技術MapReduce計算框架數(shù)據(jù)流程圖。圖3本專利技術本文檔來自技高網(wǎng)...

【技術保護點】
一種MapReduce計算框架中的高性能排序方法,其步驟包括:1)Map?Task從HDFS上讀取文件,構造輸入數(shù)據(jù)的key/value對;2)對輸入數(shù)據(jù)執(zhí)行用戶自定義Map函數(shù)并輸出中間結果的key/value對,并計算key所對應的partition;對內存中每個partition設置對應的緩沖鏈,將中間結果的key/value對首先計算長度,然后插入到緩沖鏈中;3)當內存無法放下所有中間結果的key/value對時,按照partition的順序,輸出所有緩沖鏈到本地文件;4)對經(jīng)過上述步驟后在內存和本地磁盤上形成的一個或多個未排序的結果按照partition的順序進行歸并,輸出成一個完整的按照partition進行分段的本地文件;5)Reduce?Task通過AppMaster獲得Map?Task結束的信息,向負責該Map數(shù)據(jù)托管的進程發(fā)送http請求,拖取該Map輸出的中間數(shù)據(jù)中屬于該Reduce的部分,將這些數(shù)據(jù)根據(jù)其大小選擇放于內存或放于本地磁盤;6)將內存或磁盤中的中間數(shù)據(jù)讀入內存中的排序緩沖池,當排序緩沖池滿時,對整個緩沖池進行排序;7)對于中間數(shù)據(jù)無法全部放在一個排序緩沖池中的情況,在排序后將數(shù)據(jù)寫出到本地文件中。...
【技術特征摘要】
1.一種MapReduce計算框架中的高性能排序方法,其步驟包括: 1)Map Task從HDFS上讀取文件,構造輸入數(shù)據(jù)的key/value對; 2)對輸入數(shù)據(jù)執(zhí)行用戶自定義Map函數(shù)并輸出中間結果的key/value對,并計算key所對應的partition ;對內存中每個partition設置對應的緩沖鏈,將中間結果的key/value對首先計算長度,然后插入到緩沖鏈中; 3)當內存無法放下所有中間結果的key/value對時,按照partition的順序,輸出所有緩沖鏈到本地文件; 4)對經(jīng)過上述步驟后在內存和本地磁盤上形成的一個或多個未排序的結果按照partition的順序進行歸并,輸出成一個完整的按照partition進行分段的本地文件; 5)Reduce Task通過AppMaster獲得Map Task結束的信息,向負責該Map數(shù)據(jù)托管的進程發(fā)送http請求,拖取該Map輸出的中間數(shù)據(jù)中屬于該Reduce的部分,將這些數(shù)據(jù)根據(jù)其大小選擇放于內存或放于本地磁盤; 6)將內存或磁盤中的中間數(shù)據(jù)讀入內存中的排序緩沖池,當排序緩沖池滿時,對整個緩沖池進行排序; 7)對于中間數(shù)據(jù)無法全部放在一個排序緩沖池中的情況,在排序后將數(shù)據(jù)寫出到本地文件中。2.如權利要求1所述的方法,其特征在于,還包括如下步驟: 8)對內存和本地文件中的有序結果進行歸并,歸并結果作為用戶自定義Reduce函數(shù)的輸入...
【專利技術屬性】
技術研發(fā)人員:蔣達晟,陳薇,王騰蛟,
申請(專利權)人:北京大學,
類型:發(fā)明
國別省市:北京;11
還沒有人留言評論。發(fā)表了對其他瀏覽者有用的留言會獲得科技券。