9.1 Hadoop的優(yōu)化與發(fā)展
9.1.1 Hadoop1.0的局限與不足
(1)抽象層次低:簡單任務(wù)也要很復(fù)雜的編碼;
(2)表達(dá)能力優(yōu)先:不是所有的任務(wù)都能抽象成Map和Reduce
(3)需開發(fā)者自行管理Job間依賴關(guān)系
(4)難以看到程序的整體邏輯:可以理解為沒有主流程,只有一個(gè)個(gè)的MR程序組合起來
(5)執(zhí)行迭代操作時(shí)效率低:每次MR后都寫入磁盤,供下一次MR使用,這對機(jī)器學(xué)習(xí)等而言效率很低
(6)資源浪費(fèi):M和R是嚴(yán)格分先后順序的
(7)實(shí)時(shí)性很差,只能離線批處理
9.1.2 主要的優(yōu)化和發(fā)展
(1)對M和R兩個(gè)核心組件的改進(jìn)
HDFS改進(jìn):① 設(shè)計(jì)了HDFS HA,實(shí)現(xiàn)對名稱節(jié)點(diǎn)的熱備份,② HDFS聯(lián)邦
(2)新增了很多其它組件
① Pig - 抽象層次高,使用腳本語言處理大規(guī)模數(shù)據(jù)
② Spark - 基于內(nèi)存的分布式并行編程框架,較高實(shí)時(shí)性
③ Oozie - 工作流和協(xié)作服務(wù)引擎
④ Tez - 支持DAG作業(yè)的計(jì)算框架,減少重復(fù)操作
⑤ Kafka - 銜接不同類型的分布式系統(tǒng)
9.2 HDFS2.0新特性
9.2.0 HDFS1.0的問題
1)單點(diǎn)故障問題
2)不可以水平擴(kuò)展,縱向擴(kuò)展會(huì)導(dǎo)致啟動(dòng)耗時(shí)激增
3)系統(tǒng)整體整體性能受限于單個(gè)名稱節(jié)點(diǎn)的吞吐量
4)不同程序間不可以隔離
9.2.1 HDFS HA
解決單點(diǎn)故障問題:設(shè)置兩個(gè)名稱節(jié)點(diǎn),一個(gè)活躍,一個(gè)待命,兩者通過共享存儲(chǔ)系統(tǒng)實(shí)現(xiàn)實(shí)時(shí)的狀態(tài)同步,由Zookeeper確保任意時(shí)刻只有一個(gè)名稱節(jié)點(diǎn)對外服務(wù)。
9.2.2 HDFS Federation
解決9.2.0中后幾個(gè)問題:設(shè)置了多個(gè)相互獨(dú)立的名稱節(jié)點(diǎn),共享底層的存儲(chǔ)資源,數(shù)據(jù)節(jié)點(diǎn)向所有名稱節(jié)點(diǎn)匯報(bào),不同的名稱節(jié)點(diǎn)管理不同業(yè)務(wù)數(shù)據(jù),實(shí)現(xiàn)程序隔離。
9.3 新一代資源管理調(diào)度框架 - YARN
9.3.1 MR1.0的缺陷
1)單點(diǎn)故障,一個(gè)JobTracker負(fù)責(zé)所有MR作業(yè)的調(diào)度
2)任務(wù)過重:一個(gè)JoTracker既要管資源的管理分配,又要管作業(yè)調(diào)度和失敗恢復(fù)等,進(jìn)而導(dǎo)致內(nèi)存開銷過大和易出故障
3)容易內(nèi)存溢出:TaskTracker端資源的分配僅根據(jù)MR任務(wù)的個(gè)數(shù),而不管每個(gè)任務(wù)實(shí)際消耗的CPU和內(nèi)存資源
4)資源劃分不合理:CPU和內(nèi)存都被劃分為slot,slot又被進(jìn)一步劃分為M槽和R槽,互相不使用對方的槽,而同一個(gè)程序的M和R是串行的,所以容易導(dǎo)致資源浪費(fèi)。
9.3.2 YARN設(shè)計(jì)思路
把JobTracker的資源管理、任務(wù)調(diào)度、任務(wù)監(jiān)控三個(gè)任務(wù)拆分出來,由YARN的不同模塊(ResourdeManager和ApplicationMaster)去負(fù)責(zé),原TaskTracker改為NodeManager。
注意:YARN是一個(gè)純粹的資源調(diào)度框架,而MR2.0則是一個(gè)運(yùn)行在YARN之上的純粹的計(jì)算框架。
9.3.3 YARN體系結(jié)構(gòu)

包含ResourceManager、ApplicationMaster、NodeManager三個(gè)模塊,功能闡述如下。
1)ResourceManager
RM是全局的資源管理器,負(fù)責(zé)整個(gè)集群的資源管理和分配,包含調(diào)度器Scheduler、應(yīng)用程序管理器ApplicationManager兩個(gè)核心模塊。
調(diào)度器接受AppMaster的資源請求,以容器形式進(jìn)行分配。
啟動(dòng)/監(jiān)控AppMaster、監(jiān)控NodeManager、等
2)ApplicationMaster
為應(yīng)用程序申請資源,并分配給內(nèi)部任務(wù);任務(wù)調(diào)度、監(jiān)控與容錯(cuò);以心跳的方式隨時(shí)向ResoureceManager報(bào)備。
3)NodeManager
是YARN駐留在每個(gè)節(jié)點(diǎn)的代理,管理著節(jié)點(diǎn)(容器)的生命周期、資源使用情況等,并隨時(shí)與ResourceManager通信。
注意:在部署上,ResourceManager和HDFS的名稱節(jié)點(diǎn)部署在同意節(jié)點(diǎn)上,而AppMaster和NodeManager和HDFS的數(shù)據(jù)節(jié)點(diǎn)在同一節(jié)點(diǎn)上。
9.3.4 YARN工作流程
1)用戶準(zhǔn)備好AppMaster程序、啟動(dòng)AppMaster的命令、用戶程序,三個(gè)東西,并提交給YARN
2)ResourceManager接收到請求,為應(yīng)用程序分配一個(gè)容器,并在容器里啟動(dòng)一個(gè)AppMaster
具體流程看教材P163,如圖所示。

9.3.5~6 YARN框架的補(bǔ)充
YARN不僅可以為MR計(jì)算框架提供資源調(diào)度服務(wù),也可以為Spark、Storm等跨框架服務(wù)。事實(shí)上,這也是YARN的發(fā)展目標(biāo),發(fā)展成為集群統(tǒng)一的資源管理調(diào)度框架,上面可以部署各式各樣的的計(jì)算框架,包括MR、Tez、HBase、Storm、Giraph、Spark、等等。

9.4 Hadoop生態(tài)中的代表性組件
9.4.1 Pig
1)類SQL語言的Pig Latin語言,支持過濾、分組、連接、排序等類SQL操作;
2)把Pig腳本轉(zhuǎn)化成MR作業(yè),且可以自動(dòng)優(yōu)化,因此不需要考慮代碼效率問題;
3)基本格式
① 通過LOAD語句從文件系統(tǒng)中讀取數(shù)據(jù)
② 一系列ETL語句進(jìn)行數(shù)據(jù)處理
③ 通過STORE把處理結(jié)果輸出到文件系統(tǒng)中
9.4.2 Tez
1)支持DAG作業(yè)的計(jì)算框架
2)把Map和Reduce進(jìn)一步拆分成更細(xì)的作業(yè),包括輸入、處理、排序、合并、輸出等
3)在更細(xì)顆粒度的設(shè)計(jì)下,任務(wù)可以被轉(zhuǎn)換成一個(gè)有向無環(huán)圖,避免了重復(fù)的M或R操作。經(jīng)過Tez優(yōu)化后的Hive性能可以提升100倍。
4)在Hadoop生態(tài)中的位置:MR、Pig、Hive等框架的任務(wù)最終都被轉(zhuǎn)換成MR任務(wù)執(zhí)行,而Tez相當(dāng)于對MR進(jìn)行了優(yōu)化,因此可以把MR、Pig、Hive運(yùn)行于Tez之上,而把Tez運(yùn)行于YARN之上,把YARN運(yùn)行于HDFS之上。
5)于Impala的區(qū)別:Impala拋棄了MR框架,采用與商用并行關(guān)系數(shù)據(jù)庫類似的分布式查詢引擎,效率更高,但是能處理的數(shù)據(jù)類型有限。
9.4.3 Spark
1)與MR相比,每次計(jì)算把結(jié)果放到內(nèi)存中(而非放到磁盤中)
2)同樣采用DAG任務(wù)調(diào)度機(jī)制,可以有效避免重復(fù)操作
上述兩點(diǎn)改進(jìn),加之以結(jié)構(gòu)一體化、功能多元化的優(yōu)勢,使得Spark逐漸成為當(dāng)今大數(shù)據(jù)領(lǐng)域最熱門的計(jì)算平臺(tái)。
9.4.5 Kafka
1)高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)
2)同時(shí)滿足在線實(shí)時(shí)處理和批量離線處理
3)充當(dāng)數(shù)據(jù)樞紐的作用,實(shí)現(xiàn)和Hadoop各個(gè)組件之間的不同類型的數(shù)據(jù)的實(shí)時(shí)高效交換。
如下圖
