1. 程式人生 > >大數據學習之MapReduce核心(Shuffle洗牌)12

大數據學習之MapReduce核心(Shuffle洗牌)12

disk 完成 一次 shuf bubuko 分組 pro 一定的 pill

先來個原理圖壓壓驚:

溫馨提示:如果看不清這個圖,可以下載下來,在自己電腦上可以放大。

     或者直接放大瀏覽器。快捷鍵Ctrl+鼠標滑輪上即可放大。想恢復原來瀏覽器的默認大小,快鍵鍵:Ctrl+數字0

技術分享圖片

一:概述shuffle

  Shuffle是mapreduce的核心,鏈接map與reduce的中間過程。

  Mapp負責過濾分發,而reduce則是歸並整理,從mapp輸出到reduce的輸入的這個過程稱為shuffle過程。


二:map端的shuffle 

1.map結果的輸出

  map的處理結果首先存放在一個環形的緩沖區。

  這個緩沖區的內存是100M,是map存放結果的地方。如果數據量較大,超過了一定的量(默認80M),將會發生溢寫過程。

  在mapred-site.xml中設置內存的大小

    <property>

      <name>mapreduce.task.io.sort.mb</name>

      <value>100</value>

    </property>

  在mapred-site.xml中設置內存溢寫的閾值  

    <property>

      <name>mapreduce.task.io.sort.spill.percent</name>

      <value>0.8</value>

    </property>

   

2.溢寫過程  

  溢寫是系統在後臺單獨開一個線程去操辦。

  溢寫過程包括:分區partion,排序sort,溢寫spill to disk,合並merge。

  

3.分區

  分區分的是80%的內存。

  因為reduce可能有不同的任務,所以會對80M的內存進行分區,將map的輸出結果放入的對應的reduce分區中。

  

4.排序

  默認是按照key排序。

  當分區完成之後,對每一個分區的數據進行排序。

5.溢寫

  排序之後,將內存的數據寫入硬盤。留出內存方便map的新的輸出結果。

6.合並

  如果是第一次寫入硬盤則不需要考慮合並問題,但是在大數據的情況下,前面已經存在大量的spill文件的時候,這時候需要將它們進行合並。

  將各個分區合並之後,對每一個分區的數據再進行一次排序

  使用歸並的方式進行合並,歸並算法。

  實現compara,進行比較。

  形成一個文件。

三:reduce端的shuffle

1.步驟

  對於reduce端的shuffle,大致分為復制,合並。

2.復制

  當reduce開啟任務後,不斷的在各個節點復制需要的數據。

3.合並(內含排序)

  復制數據的時候,把可以存放進內存的就把數據存放在內存中,當達到一定的時候,啟動merge,將數據寫進硬盤。

  如果map數據大於內存需要存放的限制,直接寫入硬盤,當達到一定的數量後將其合並為一個文件。

  這時候,reduce開啟任務需要的數據在內存中和在硬盤中,最終形成一個全局文件。

4.分組

  《hadoop,1》

  《hadoop,1》

  《yarn,1》

  《hadoop,1》

  《hdfs,1》

  《yarn,1》

  將相同的key放在一起,使用comparable完成比較。

  結果為:

    《hadoop,list(1,1,1)》

    《yarn,list(1,1)》

    《hdfs,list(1)》

再來個簡易版的洗牌圖吧!!!以便理解

技術分享圖片

大數據學習之MapReduce核心(Shuffle洗牌)12