Hadoop系統(tǒng)架構(gòu)
一、Hadoop系統(tǒng)架構(gòu)圖

Hadoop1.0與hadoop2.0架構(gòu)對比圖

YARN架構(gòu):
ResourceManager
–處理客戶端請求
–啟動/監(jiān)控ApplicationMaster
–監(jiān)控NodeManager
–資源分配與調(diào)度
NodeManager
–單個節(jié)點上的資源管理
–處理來自ResourceManager的命令
–處理來自ApplicationMaster的命令
ApplicationMaster
–數(shù)據(jù)切分
–為應(yīng)用程序申請資源,并分配給內(nèi)部任務(wù)
–任務(wù)監(jiān)控與容錯
YARN作業(yè)處理流程:

步驟1 用戶向YARN 中提交應(yīng)用程序, 其中包括ApplicationMaster 程序、啟動ApplicationMaster 的命令、用戶程序等。
步驟2 ResourceManager 為該應(yīng)用程序分配第一個Container, 并與對應(yīng)的NodeManager 通信,要求它在這個Container 中啟動應(yīng)用程序的ApplicationMaster。
步驟3 ApplicationMaster 首先向ResourceManager 注冊, 這樣用戶可以直接通過ResourceManage 查看應(yīng)用程序的運行狀態(tài),然后它將為各個任務(wù)申請資源,并監(jiān)控它的運行狀態(tài),直到運行結(jié)束,即重復(fù)步驟4~7。
步驟4 ApplicationMaster 采用輪詢的方式通過RPC 協(xié)議向ResourceManager 申請和領(lǐng)取資源。
步驟5 一旦ApplicationMaster 申請到資源后,便與對應(yīng)的NodeManager 通信,要求它啟動任務(wù)。
步驟6 NodeManager 為任務(wù)設(shè)置好運行環(huán)境(包括環(huán)境變量、JAR 包、二進(jìn)制程序
等)后,將任務(wù)啟動命令寫到一個腳本中,并通過運行該腳本啟動任務(wù)。
步驟7 各個任務(wù)通過某個RPC 協(xié)議向ApplicationMaster 匯報自己的狀態(tài)和進(jìn)度,以讓ApplicationMaster 隨時掌握各個任務(wù)的運行狀態(tài),從而可以在任務(wù)失敗時重新啟動任務(wù)。在應(yīng)用程序運行過程中,用戶可隨時通過RPC 向ApplicationMaster 查詢應(yīng)用程序的當(dāng)
前運行狀態(tài)。
步驟8 應(yīng)用程序運行完成后,ApplicationMaster 向ResourceManager 注銷并關(guān)閉自己。
運行在YARN上帶來的好處 :
–一個集群部署多個版本
–計算資源按需伸縮
–不同負(fù)載應(yīng)用混搭,集群利用率高
–共享底層存儲,避免數(shù)據(jù)跨集群遷移
Hadoop 2.0 HA實現(xiàn)方式說明:
利用共享存儲在兩個NN間同步edits信息,如NFS等中高端存儲設(shè)備內(nèi)部的各種RAID以及冗余硬件
DataNode同時向兩個NN匯報塊信息,讓Standby NN保持集群最新狀態(tài)
用FailoverController watchdog進(jìn)程監(jiān)視和控制NN進(jìn)程,防止因 NN FullGC掛起無法發(fā)送heart beat
防止腦裂(brain-split):主備切換時由于切換不徹底等原因?qū)е耂lave誤以為出現(xiàn)兩個active master,通常采用Fencing機(jī)制:
-共享存儲fencing,確保只有一個NN可以寫入edits
-客戶端fencing,確保只有一個NN可以響應(yīng)客戶端的請求
- DN fencing,確保只有一個NN可以向DN下發(fā)刪除等命令
HDFS文件讀?。?/p>

HDFS文件寫入:

MapReduce基本流程:

從MapReduce 自身的命名特點可以看出, MapReduce 由兩個階段組成:Map 和Reduce。用戶只需編寫map() 和 reduce() 兩個函數(shù),即可完成簡單的分布式程序的設(shè)計。
map() 函數(shù)以key/value 對作為輸入,產(chǎn)生另外一系列 key/value 對作為中間輸出寫入本地磁盤。 MapReduce 框架會自動將這些中間數(shù)據(jù)按照 key 值進(jìn)行聚集,且key 值相同(用戶可設(shè)定聚集策略,默認(rèn)情況下是對 key 值進(jìn)行哈希取模)的數(shù)據(jù)被統(tǒng)一交給 reduce() 函數(shù)處理。
reduce() 函數(shù)以key 及對應(yīng)的value 列表作為輸入,經(jīng)合并 key 相同的value 值后,產(chǎn)生另外一系列 key/value 對作為最終輸出寫入HDFS
hello world --WordCount
用戶編寫完MapReduce 程序后,按照一定的規(guī)則指定程序的輸入和輸出目錄,并提交到Hadoop 集群中。作業(yè)在Hadoop 中的執(zhí)行過程如圖所示。Hadoop 將輸入數(shù)據(jù)切分成若干個輸入分片(input split,后面簡稱split),并將每個split 交給一個Map Task 處理;Map Task 不斷地從對應(yīng)的split 中解析出一個個key/value,并調(diào)用map() 函數(shù)處理,處理完之后根據(jù)Reduce Task 個數(shù)將結(jié)果分成若干個分片(partition)寫到本地磁盤;同時,每個Reduce Task 從每個Map Task 上讀取屬于自己的那個partition,然后使用基于排序的方法將key 相同的數(shù)據(jù)聚集在一起,調(diào)用reduce() 函數(shù)處理,并將結(jié)果輸出到文件中