MapReduce的運行原理

MapReduce的執行步驟:

在這裏插入圖片描述

  1. 每個Map上創建一個split數據,默認和block大小相同,每一個split都會由一個map task進行處理,從block中讀取出每一行的數據會變成一個個的鍵值對<K,V>。

  2. 接下來,讀取出來的數據都會進入內存緩衝區,在進入緩衝區之前,每一條數據都會被打上標籤,這個過程叫做分區,由分區器來完成,默認的分區器是HashPartitioner,然後數據就會被讀取到緩衝區,緩衝區會將這些數據先進行combiner,然後進行排序,排序規則是先根據分區號來排序,然後根據key來排序,緩衝區大小爲100M,分爲兩個部分,分別是80M和20M,之所以這樣劃分是爲了在內存中讀滿數據的時候,80M的數據會溢寫到磁盤中形成一個個小文件,在這個時候,由剩下的20M內存進行讀數據,提高計算效率。

  3. 接下來,磁盤中一個個排好序的小文件會被合併成一個大文件,過程中會使用歸併排序將屬於同一分區的數據合併大大文件中的同一分區,在排序的過程中還會進行一次combiner。

  4. 當所有的map task完成後,每一個map task都會形成一個最終文件,並且該文件按區進行劃分。在reduce中,就會拉取各個map中的屬於同一分區的數據到相應的reduce task,當內存滿了就會進行溢寫,在溢寫前會進行排序,當把這個分區的數據全部拉取過來之後,磁盤中一個個的小文件會進行合併,合併的過程中也會根據key進行排序。排完序之後,會把合併後的大文件進行分組,相同的key爲一組,每一組數據調用一次reduce。第一組調用reduce形成一個結果文件,其他組形成的結果也會追加到這個結果文件中,也就是說,一個分區的數據只會形成一個結果文件。

MapReduce分佈式計算框架體系結構

Hadoop1.x版本:

角色:
  • JobTracker
    JobTracker是整個集羣的核心,是集羣的資源調度主節點以及任務調度主節點

  • TaskTracker
    1、JobTracker的從節點,負責自身節點的資源管理,會週期性的向JobTracker彙報心跳,心跳信息包括任務執行進度、任務運行狀態、資源使用情況、節點健康情況等。
    2、TaskTracker會執行JobTracker下發的各種命令,主要包括:啓動任務、提交任務、殺死任務和重新初始化。

  • Client
    以作業爲單位,把任務提交到JobTracker

弊端:

  • JobTracker負載過重,容易產生單點故障
  • 資源管理與計算調度強耦合,其他計算框架需要重複實現資源管理、
  • 不同框架對資源不能全局管理,存在資源隔離以及搶奪問題

Hadoop2.x版本 yarn:

在這裏插入圖片描述

角色:
  • ResourceManager
    負責集羣的資源調度,是整個集羣的核心,根據客戶端的請求啓動應用對應的ApplicationMaseter。
    同時會有zookeeper集羣管理着一個備用的ResourceManager。

  • NodeManager
    1.向ResourceManager彙報資源
    2.管理Container生命週期

  • Container
    存在於NodeManager節點,具體任務task的計算單元
    默認NodeManager啓動線程監控Container大小,超出申請資源額度,kill

  • ApplicationMaster
    管理應用的生命週期,向ResourceManager申請資源,以作業爲單位,把作業分發到不同的節點,管理任務對應的Container。
    ApplicationMaster一旦掛掉,整哥任務都停止了,此事ResourceManager會重新啓動ApplicationMaster。

  • Client
    請求資源創建AM
    與AM進行交互

工作流程:

1、提交MapReduce程序,向NameNode請求要處理文件的Block的位置信息。
2、向ResourceManager申請資源,請求啓動一個ApplicationMaster。
3、RM接收到請求後隨機選擇一臺資源充足的節點啓動Container容器
4、NodeManager會在這個Container容器中啓動一個ApplicationMaster(任務調度器)
5、client把請求到的Block的位置信息提交到AM。
6、AM根據這些位置信息向ResourceManager申請資源,RM接收請求選擇資源充足的節點啓動一個Container容器,並在容器中創建yarn-child進程。
7、AM分發Map Task線程到各個yarn-child中執行。
8、在每個yarn-child所在節點,每個Map Task線程執行完後會都會生成一個磁盤文件。
9、如果yarn-child節點資源充足,AM會優先選擇這些節點分發Reduce Task任務。
10、等Reduce Task執行完之後,會把結果文件寫入HDFS。

總結:

在Hadoop2.x版本,將原本的JobTracker中的資源調度器和任務調度器進行了拆分,分別由ResourceManager和ApplicationMaseter進程實現,yarn的引入,使的多個計算框架可以在同一個集羣運行,如果其他的計算框架需要運行在yarn集羣,只需要實現ApplicationMaster組件即可。

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