一、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() 函數處理,并将結果輸出到檔案中