1. 程式人生 > >大資料開發之Hadoop篇----mapreduce概念以及架構

大資料開發之Hadoop篇----mapreduce概念以及架構

在我們瞭解了hdfs的一些基礎概念以後,我們現在就來進一步瞭解一下mapreduce的相關概念。

首先,mapreduce在hadoop體系裡面充當一個計算者的角色,但如我們之前所演示一樣我們在開啟hdfs和yarn時都有相關的程序,但mapreduce就是沒有的。mapreduce是直接執行在yarn上面的,我們來簡單描述一下hdfs,yarn和mapreduce三者的關係。

最底層的是hdfs,其作為儲存的角色。在其之上的是yarn,這個是充當了資源排程和作業分配的角色。最後是mapreduce直接使用hdfs上的資料在yarn上進行計算。

而在mapreduce中,map物件和reduce物件是最為主要和重要的抽象類。我們在這裡先將這兩貨理解為兩個方法吧,對應的分別是大資料計算的兩個階段:map階段和reduce階段,中間還有一個shuffle過程,一般有些人喜歡將這個過程算到reduce階段裡面。那什麼是map和reduce呢?map我們可以理解為是一個對映關係,就是通過一個統一的規則將所有的資料轉化成另外一種格式或者樣式,一般在大資料開發的過程,我們會將單個原素轉化成一個key,value的鍵值對方便後面的shuffle和reduce過程。而reduce我們可以理解為是一種聚合分組的概念,就是將相同的key的元素統一計算其value值。至於中間的shuffle過程你可以理解為是一個數據重新分配的過程,後面我們將詳細地介紹這個過程,同時shuffle也將伴隨你的整個大資料開發的生涯,很多大資料元件都從中引用了這一個概念。

簡單舉個例子來說明下map和reduce在sql語句中對應的是什麼:

select age+1 as newAge from t; 就是我選擇一個年齡的欄位對每一個值都執行一個+1操作就是map,執行的是一個統一對映操作

select name max(sale) from t group by name;就是根據年齡進行分組聚合,將相同名字的人的最高工資show出來,最後我們的key是name而對value(sale)進行了一個聚合

下面我們來講一下mapreduce的架構,其實就是你把作業提交的yarn上時yarn的執行流程。

1,使用者想yarn的ResourceManager提交了應用程式,其中包括:ApplicationMaster程式,啟動ApplicationMaster程式請求,以及使用者程式等。

2,ResourceManager首先為該程式分配一個container容器(執行緒),並與對應放置這個container的NodeManager進行rpc通訊,要求他在這個container中啟動一個應用程式的ApplicationMaster。

3,ApplicationMaster首先想ResourceManager註冊,這樣使用者就可以直接通過ResourceManager檢視應用程式的執行狀態,檢視各個任務的資源狀態執行狀態等。

4,ApplicationMaster以輪詢的方式通過rpc通訊向ResourceScheduler申請資源,當拿到資源列表(就是哪些機器有空閒資源就呼叫他們來執行計算),就可以去訪問那些機器。

5,一旦ApplicationMaster申請到資源後,便與對應的NodeManager節點通訊,要求它啟動一個container,這個container是用來執行我們現在所提交的作業的各種task的。

6,NodeManager節點啟動一個container執行task。

7,各個容器的task通過rpc向ApplictionMaster彙報自己的狀態和進度,以讓ApplicationMaster隨時掌握各個task的狀態,如果某task失敗時,ApplicationMaster可以重啟這個task,使用者也可以通過web介面實時瞭解作業的執行情況。

8,App完成後,ApplicationMaster向ApplicationManager登出並關閉這個作業。

Ps:reduce和map這兩個task不會在同一個container裡,一個container只對應一個task或者一個ApplicationMaster。

這裡我們其實可以總結一個:在yarn當中有主節點是ResourceManager和一堆從節點NodeManager(這個是物理存在的結構)。其中ResourceManager負責管理叢集的資源和監視所有提交執行的App以及監控每個NodeManager(主要是資源層面的東西,具體的作業不實際管理),而在ResourceManager裡面又有ApplicationManager和ResourceScheduler,前者是對應Apps作業的後者是對應資源分配的。

而每一個Apps在NodeManager裡面都有一個ApplicationMaster負責管理這個app的執行以及反饋狀態情況給ApplicationManager,然後還有一堆的NodeManager開啟了container來執行這個app中的各個task。

所以我們可以理解為資源端或者實際結構上的主從結構是ResourceManager和NodeManager,而作業端是ApplicationMaster管理一個作業,在一堆NodeManager中啟動多個container來執行各個task(當然了ApplicationMaster也是在一個container當中的)