1. 程式人生 > >Hadoop生態圈之MapReduce

Hadoop生態圈之MapReduce

什麼是MapReduce?

MapReduce是一個分散式計算框架,以可靠,容錯的方式在大型叢集(數千個節點)上並行處理大量資料(多為TB級資料)。

MapReduce的主要思想是:分久必合
MapReduce的核心思想是:把相同的key分成一組,呼叫一次Reduce方法。

一、MapReduce分散式計算原理

MapReduce分散式計算原理
理論上block大小=split切片大小=map task
實際上split的大小比blcok大幾kb或小几kb,因為有部分資料會被切割在其他block中

shuffle write階段:

首先,Map task將處理後的每一條記錄打上標籤,其目的就是讓此記錄將來讓哪個Reduce task處理。簡單理解就是打標籤的目的是為了

分割槽此次分割槽是基於偏移量進行,即分出多少個區。然後根據key的HashCode與Reduce task的個數取模從而將key值相同的記錄放在一個分割槽。此時每一條記錄就由三部分組成包括分割槽號、key、value。

其次,Map task將一條條的記錄寫入buffer中,當寫入資料的大小達到80M此時這80M的記憶體將會被封鎖,封鎖的過程中,執行緒會對記憶體中的資料進行combiner(小聚合),然後進行排序(排序規則為二次排序,首先根據分割槽號,然後根據key),然後將分割槽號相同的資料放在一起,此時分割槽內的資料是有序的。待combiner、排序完成後,就開始溢寫資料到磁碟,這時候磁碟檔案就是一個根據分割槽號分好區,並且內部有序的檔案。

最後,Map task會將磁碟上的小檔案合併成一個大檔案,在合併的過程中,使用歸併排序演算法將小檔案合併成一個有序的大檔案。每一個Map task都會執行同樣的操作,併產生一個有分割槽並且分割槽內部有序的檔案。

shuffle red階段:

首先,Reduce task去Map端讀取相應的分割槽資料,然後將分割槽後的資料寫入到記憶體中,記憶體滿後就會溢寫,在溢寫之前會進行排序,當所有的資料讀取過來後,Reduce task會將溢寫的小檔案排序、合併成一個有序的大檔案。最後每一組資料會呼叫reduce函式,產生結果。

產生一個有序大檔案的目的:

為了提高分組的效率。

二、MapReduce1.X執行流程

1.X執行架構

  1. client將Application打成jar包,然後交給JobTracker;
  2. 為了遵循計算向資料移動的原則,JobTracker會向NameNode傳送請求,詢問block的位置資訊;
  3. JobTracker收到block的列表資訊後,會向有資料的TaskTracker傳送資訊,請求分配資源。即啟動計算程序,供map task進行計算。每一個map task計算完成後,都會產生一個磁碟檔案;
  4. JobTracker呼叫Reduce Task去Map端的分割槽拉取資料,拉取成功之後將最終的結果寫入結果檔案,然後返回給客戶端。

JobTracker的作用:

  • 負責資源排程(主節點)
  • 負責任務排程(主節點)

問題:

  • 負載過高,容易發生單點故障
  • 與MapReduce的耦合度過高,若spark也要執行到這套框架上,需要自己去實現,故此叢集就存在兩套資源排程器,從而出現資源隔離問題和資源搶佔問題。

三、MapReduce2.X YARN執行原理

在這裡插入圖片描述

  1. Client拿到Application計算檔案的路徑後,找NameNode獲取每一個block的位置,獲得blcok的報表;
  2. Client向RM傳送請求,為ApplicationMaster申請資源;
  3. RM接受客戶端的請求,然後檢視哪個節點資源充足,如果大部分節點資源都充足,那就隨機找一臺節點啟動container容器,若大部分節點都資源緊張,則無法啟動;
  4. 例如在node01上規劃出一個container以後,NameNode會在容器中啟動一個ApplicationMaster(主要負責任務排程);
  5. Client會將NameNode生成的報表傳送給ApplicationMaster;
  6. ApplicationMaster拿到報表後,根據報表去找RM申請資源,RM會檢視哪臺節點資源充足,然後啟動caontainer容器,在container中啟動Yarn-child;
  7. ApplicationMaster會分發map task到各個Yarn-child中執行,map task執行完成後,會產生磁碟檔案(每一個map task會產生一個磁碟檔案),然後ApplicationMaster會呼叫Reduce task去進行計算,待Reduce task計算完成後,將執行結果寫入結果檔案,然後返回給客戶端。