【轉】大數據【五十九】Map Reduce中的排序

一。排序的分類

排序貫穿於Map任務和Reduce任務,是MapReduce非常重要的一環,排序操作屬於MapReduce計算框架的默認行爲,不管流程是否需要,都會進行排序。在MapReduce計算框架中,主要用到了兩種排序方法:快速排序和歸併排序

快速排序:

    通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據比另外一部分的所有數據都小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此使整個數據成爲有序序列。

歸併排序:

    歸併排序在分佈式計算裏面用的非常多,歸併排序本身就是一個採用分治法的典型應用。歸併排序是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分爲若干個有序的子序列,再把有序的子序列合併爲整體有序序列。
在map任務和reduce任務的過程中,一共發生3次排序操作。

二。mapperReducer中的排序

    在這3次排序中第一次是在內從緩衝區做的排序,使用的算法是快速排序,第二次排序和第三次排序都是在文件合併階段發生的,使用的是歸併排序

第一次排序

     當map函數產生輸出時,會首先寫入內存的環形緩衝區,當達到設定的閾值,在刷寫磁盤之前,後臺線程會將緩衝區的數據劃分成相應的分區。在每個分區中,後臺線程按鍵進行內排序。

    一旦緩衝區內容達到閾值(mapreduce.map.io.sort.spill.percent,默認0.80,或者80%),就會會鎖定這80%的內存,並在每個分區中對其中的鍵值對按鍵進行sort排序,具體是將數據按照partition和key兩個關鍵字進行排序,排序結果爲緩衝區內的數據按照partition爲單位聚集在一起,同一個partition內的數據按照key有序。

第二次排序

    在Map任務完成之前,磁盤上存在多個已經分好區,並排好序的、大小和緩衝區一樣的溢寫文件,這時溢寫文件將被合併成一個已分區且已排序的輸出文件。由於溢寫文件已經經過第一次排序,所以合併文件時只需要再做一次排序就可使輸出文件整體有序。

    當整個map任務完成溢出寫後,會對磁盤中這個map任務產生的所有臨時文件(spill文件)進行歸併(merge)操作生成最終的正式輸出文件。此時的歸併是將所有spill文件中的相同partition合併到一起,並對各個partition中的數據再進行一次排序(sort),生成key和對應的value-list

第三次排序

     在shuffle階段,需要將多個Map任務的輸出文件合併,由於經過第二次排序,所以合併文件時只需要再做一次排序就可使輸出文件整體有序

   當屬於該reducer的map輸出全部拷貝完成,則會在reducer上生成多個文件(如果拖取的所有map數據總量都沒有內存緩衝區,則數據就只存在於內存中),這時開始執行合併操作,即磁盤到磁盤merge,Map的輸出數據已經是有序的,Merge進行一次合併排序,所謂Reduce端的sort過程就是這個合併的過程,採取的排序方法跟map階段不同,因爲每個map端傳過來的數據是排好序的,因此衆多排好序的map輸出文件在reduce端進行合併時採用的是歸併排序,針對鍵進行歸併排序。

文章轉載:https://blog.csdn.net/IqqIqqIqqIqq/article/details/81710369

參考:大數據【五十二】【轉】MapReduce的shuffle過程詳解(分片、分區、合併、歸併。。。)

三。自己百度百科的內容:

【歸併排序】百度百科   

    歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。歸併排序是一種穩定的排序方法。

歸併排序原理

歸併排序具體工作原理如下(假設序列共有n個元素):

將序列每相鄰兩個數字進行歸併操作(merge),形成floor(n/2+n%2)個序列,排序後每個序列包含兩個元素

將上述序列再次歸併,形成floor(n/4)個序列,每個序列包含四個元素

重複步驟2,直到所有元素排序完畢

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章