Hadoop系統架構


一、Hadoop系統架構圖

Hadoop1.0與hadoop2.0架構對比圖

 

YARN架構:

ResourceManager

–處理客戶端請求
–啟動/監控ApplicationMaster
–監控NodeManager
–資源分配與調度

NodeManager

–單個節點上的資源管理
–處理來自ResourceManager的命令
–處理來自ApplicationMaster的命令

ApplicationMaster

–數據切分
–為應用程序申請資源,並分配給內部任務
–任務監控與容錯
 
YARN作業處理流程:
 

步驟1 用戶向YARN 中提交應用程序, 其中包括ApplicationMaster 程序、啟動ApplicationMaster 的命令、用戶程序等。

步驟2 ResourceManager 為該應用程序分配第一個Container, 並與對應的NodeManager 通信,要求它在這個Container 中啟動應用程序的ApplicationMaster。

步驟3 ApplicationMaster 首先向ResourceManager 注冊, 這樣用戶可以直接通過ResourceManage 查看應用程序的運行狀態,然后它將為各個任務申請資源,並監控它的運行狀態,直到運行結束,即重復步驟4~7。

步驟4 ApplicationMaster 采用輪詢的方式通過RPC 協議向ResourceManager 申請和領取資源。

步驟5 一旦ApplicationMaster 申請到資源后,便與對應的NodeManager 通信,要求它啟動任務。

步驟6 NodeManager 為任務設置好運行環境(包括環境變量、JAR 包、二進制程序

等)后,將任務啟動命令寫到一個腳本中,並通過運行該腳本啟動任務。

步驟7 各個任務通過某個RPC 協議向ApplicationMaster 匯報自己的狀態和進度,以讓ApplicationMaster 隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務。在應用程序運行過程中,用戶可隨時通過RPC 向ApplicationMaster 查詢應用程序的當

前運行狀態。

步驟8 應用程序運行完成后,ApplicationMaster 向ResourceManager 注銷並關閉自己。

 

運行在YARN上帶來的好處 :

–一個集群部署多個版本
–計算資源按需伸縮
–不同負載應用混搭,集群利用率高
–共享底層存儲,避免數據跨集群遷移
 
Hadoop 2.0  HA實現方式說明:

利用共享存儲在兩個NN間同步edits信息,如NFS等中高端存儲設備內部的各種RAID以及冗余硬件

DataNode同時向兩個NN匯報塊信息,讓Standby NN保持集群最新狀態

用FailoverController watchdog進程監視和控制NN進程,防止因  NN FullGC掛起無法發送heart beat

防止腦裂(brain-split):主備切換時由於切換不徹底等原因導致Slave誤以為出現兩個active master,通常采用Fencing機制:

-共享存儲fencing,確保只有一個NN可以寫入edits

-客戶端fencing,確保只有一個NN可以響應客戶端的請求

- DN fencing,確保只有一個NN可以向DN下發刪除等命令

 

HDFS文件讀取:

 

HDFS文件寫入:

 

MapReduce基本流程:

從MapReduce 自身的命名特點可以看出, MapReduce 由兩個階段組成:Map 和Reduce。用戶只需編寫map() 和 reduce() 兩個函數,即可完成簡單的分布式程序的設計。

map() 函數以key/value 對作為輸入,產生另外一系列 key/value 對作為中間輸出寫入本地磁盤。 MapReduce 框架會自動將這些中間數據按照 key 值進行聚集,且key 值相同(用戶可設定聚集策略,默認情況下是對 key 值進行哈希取模)的數據被統一交給 reduce() 函數處理。

reduce() 函數以key 及對應的value 列表作為輸入,經合並 key 相同的value 值后,產生另外一系列 key/value 對作為最終輸出寫入HDFS

hello world --WordCount

用戶編寫完MapReduce 程序后,按照一定的規則指定程序的輸入和輸出目錄,並提交到Hadoop 集群中。作業在Hadoop 中的執行過程如圖所示。Hadoop 將輸入數據切分成若干個輸入分片(input split,后面簡稱split),並將每個split 交給一個Map Task 處理;Map Task 不斷地從對應的split 中解析出一個個key/value,並調用map() 函數處理,處理完之后根據Reduce Task 個數將結果分成若干個分片(partition)寫到本地磁盤;同時,每個Reduce Task 從每個Map Task 上讀取屬於自己的那個partition,然后使用基於排序的方法將key 相同的數據聚集在一起,調用reduce() 函數處理,並將結果輸出到文件中





 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM