Hadoop生態圈之MapReduce
什麼是MapReduce?
MapReduce是一個分散式計算框架,以可靠,容錯的方式在大型叢集(數千個節點)上並行處理大量資料(多為TB級資料)。
MapReduce的主要思想是:分久必合
MapReduce的核心思想是:把相同的key分成一組,呼叫一次Reduce方法。
一、MapReduce分散式計算原理
理論上block大小=split切片大小=map task
實際上split的大小比blcok大幾kb或小几kb,因為有部分資料會被切割在其他block中
shuffle write階段:
首先,Map task將處理後的每一條記錄打上標籤,其目的就是讓此記錄將來讓哪個Reduce task處理。簡單理解就是打標籤的目的是為了
其次,Map task將一條條的記錄寫入buffer中,當寫入資料的大小達到80M,此時這80M的記憶體將會被封鎖,封鎖的過程中,執行緒會對記憶體中的資料進行combiner(小聚合),然後進行排序(排序規則為二次排序,首先根據分割槽號,然後根據key),然後將分割槽號相同的資料放在一起,此時分割槽內的資料是有序的。待combiner、排序完成後,就開始溢寫資料到磁碟,這時候磁碟檔案就是一個根據分割槽號分好區,並且內部有序的檔案。
最後,Map task會將磁碟上的小檔案合併成一個大檔案,在合併的過程中,使用歸併排序演算法,將小檔案合併成一個有序的大檔案。每一個Map task都會執行同樣的操作,併產生一個有分割槽並且分割槽內部有序的檔案。
shuffle red階段:
首先,Reduce task去Map端讀取相應的分割槽資料,然後將分割槽後的資料寫入到記憶體中,記憶體滿後就會溢寫,在溢寫之前會進行排序,當所有的資料讀取過來後,Reduce task會將溢寫的小檔案排序、合併成一個有序的大檔案。最後每一組資料會呼叫reduce函式,產生結果。
產生一個有序大檔案的目的:
為了提高分組的效率。
二、MapReduce1.X執行流程
- client將Application打成jar包,然後交給JobTracker;
- 為了遵循計算向資料移動的原則,JobTracker會向NameNode傳送請求,詢問block的位置資訊;
- JobTracker收到block的列表資訊後,會向有資料的TaskTracker傳送資訊,請求分配資源。即啟動計算程序,供map task進行計算。每一個map task計算完成後,都會產生一個磁碟檔案;
- JobTracker呼叫Reduce Task去Map端的分割槽拉取資料,拉取成功之後將最終的結果寫入結果檔案,然後返回給客戶端。
JobTracker的作用:
- 負責資源排程(主節點)
- 負責任務排程(主節點)
問題:
- 負載過高,容易發生單點故障
- 與MapReduce的耦合度過高,若spark也要執行到這套框架上,需要自己去實現,故此叢集就存在兩套資源排程器,從而出現資源隔離問題和資源搶佔問題。
三、MapReduce2.X YARN執行原理
- Client拿到Application計算檔案的路徑後,找NameNode獲取每一個block的位置,獲得blcok的報表;
- Client向RM傳送請求,為ApplicationMaster申請資源;
- RM接受客戶端的請求,然後檢視哪個節點資源充足,如果大部分節點資源都充足,那就隨機找一臺節點啟動container容器,若大部分節點都資源緊張,則無法啟動;
- 例如在node01上規劃出一個container以後,NameNode會在容器中啟動一個ApplicationMaster(主要負責任務排程);
- Client會將NameNode生成的報表傳送給ApplicationMaster;
- ApplicationMaster拿到報表後,根據報表去找RM申請資源,RM會檢視哪臺節點資源充足,然後啟動caontainer容器,在container中啟動Yarn-child;
- ApplicationMaster會分發map task到各個Yarn-child中執行,map task執行完成後,會產生磁碟檔案(每一個map task會產生一個磁碟檔案),然後ApplicationMaster會呼叫Reduce task去進行計算,待Reduce task計算完成後,將執行結果寫入結果檔案,然後返回給客戶端。