我們都知道Hadoop誕生的目標是為了支持十幾臺機器的搜索服務(wù)严里,但是隨著數(shù)據(jù)的增加燕偶,數(shù)據(jù)的可用性也是一個待解決的問題缝龄。但是Hadoop框架的自身問題限制了集群的發(fā)展寨闹。
首先是胶坠,JobTracker和NameNode的單點問題,嚴重制約了集群的擴展和可靠性繁堡。
其次我們通過:
知道沈善。MapReduce采用了基于slot的資源分配模型,slot是一種粗粒度的資源 劃分單位帖蔓,通常一個任務(wù)不會用完槽位對應(yīng)的資源矮瘟,且其他任務(wù)也無法使用這些空閑資源,同時map的槽位和reduce的槽位是不可以通用的。會導(dǎo)致部分資源緊張塑娇,部分資源空閑澈侠。
同時為了滿足在線計算等新的計算框架,MapReduce這種離線計算框架已經(jīng)不能滿足需求埋酬。
Yarn框架
JobTracker在 YARN 中JobTracker大約分成了 3 塊:
- 一部分是 ResourceManager哨啃,負責(zé) Scheduler 及
ApplicationsManager烧栋; - 一部分是 ApplicationMaster,負責(zé) job 的生命周期管理拳球;
- 最后一部分是 JobHistroyServer审姓,負責(zé)日志的展
示。
為了支持更多的計算模型祝峻,把以前的 TaskTracker 替換成了 NodeManager魔吐。NodeManager 管理各種各樣的 container。Container
才是真正干活的莱找。計算模型相關(guān)的事情可以放在 NodeManager 的一個擴展服務(wù)中酬姆,如 MAP-REDUCE 的 shuffle。
各大模塊分析
ResourceManager
RM 是一個全局的資源管理器奥溺,負責(zé)整個系統(tǒng)的資源管理和分配,包括 scheduler 和 Application Manager, NM Manager
對調(diào)度器來說辞色,YARN 提供了多種直接可用的調(diào)度器, Fair Scheduler 和 Capacity Scheduler 等浮定。調(diào)度器僅根據(jù)各個應(yīng)用程序的資源需 求進行資源分配,分配的基本單位是Container,而容器里面是將內(nèi)存相满,CPU,網(wǎng)絡(luò)桦卒,磁盤封裝到一起立美。
同時用戶也可設(shè)計自己的調(diào)度器。
ApplicationMaster
對應(yīng)用程序管理器來說方灾,悯辙,包括應(yīng)用程序提交、與調(diào)度器協(xié)商 資源以啟動 ApplicationMaster迎吵、監(jiān)控 ApplicationMaster 運行狀態(tài)并在失敗時重新啟動它等。用戶提交的每個應(yīng)用程序均包含一個 ApplicationMaster,ApplicationMaster可以與RM協(xié)商獲取資源针贬,也可以將得到的任務(wù)進行再分配击费,與NM通信,同時可以監(jiān)控所有的任務(wù)狀態(tài)桦他。
NodeManager
NodeManager 管理 container蔫巩、資源下載、健康檢測后匯報 對節(jié)點管理器來說快压,NM是每個節(jié)點上的資源和任務(wù)管理器圆仔,一方面,它會定時地向 RM 匯報本節(jié)點上的 資源使用情況和各個 Container 的運行狀態(tài)蔫劣;另一方面坪郭,它接收并處理來自 AM 的 Container 啟動 / 停止等各種請求。
Container
Container 是 YARN 中的資源抽象脉幢,它封裝了某個節(jié)點上的多維度資源歪沃,如內(nèi)存嗦锐、 CPU、磁盤沪曙、網(wǎng)絡(luò)等奕污,當(dāng) AM 向 RM 申請資源時,RM 為 AM 返回的資源便是用 Container 表示的液走。YARN 會為每個任務(wù)分配一個 Container碳默,且該任務(wù)只能使用該 Container 中描述的 資源。容器是一個動態(tài)劃分資源缘眶。
Jobhistory 機制
在 MRv1 中嘱根,JobHistroy server 是嵌入在 Jobtracker 中的,當(dāng)有大量的查詢 時磅崭,對 Jobtracker 造成很大的壓力.Yarn中實現(xiàn)一套單獨的 JobHistroy server 服務(wù)儿子。AggregatedLogDeletionService:日志文件的 管理。 ? HistoryClientService:提供一些服務(wù)供 JobClient 查詢砸喻。
Yarn工作流程
- 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 包责循、二進制程序 等)后,將任務(wù)啟動命令寫到一個腳本中攀操,并通過運行該腳本啟動任務(wù)院仿。
- 7. 各個任務(wù)通過某個 RPC 協(xié)議向 ApplicationMaster 匯報自己的狀態(tài)和進度,以 讓 ApplicationMaster 隨時掌握各個任務(wù)的運行狀態(tài)速和,從而可以在任務(wù)失敗時重新啟動任務(wù)意蛀。 在應(yīng)用程序運行過程中耸别,用戶可隨時通過 RPC 向 ApplicationMaster 查詢應(yīng)用程序的當(dāng) 前運行狀態(tài)。
- 8. 應(yīng)用程序運行完成后县钥, ApplicationMaster 向 ResourceManager 注銷并關(guān)閉自己秀姐。