開始學(xué)習(xí)Hadoop了慎冤,其中很重要的一塊就是它的存儲(chǔ)系統(tǒng)-HDFS睡腿,先學(xué)學(xué)HDFS
HDFS概述
HDFS源于Google發(fā)表于2003年10月的GFS論文服赎,為GFS的克隆版型宝,HDFS是 Hadoop Distributed File System的簡寫, 它是一個(gè)易于擴(kuò)展的分布式文件系統(tǒng),運(yùn)行在大量普通廉價(jià)機(jī)器上坛梁,成本較低,并且通過多副本方式提供較好的容錯(cuò)能力
優(yōu)點(diǎn)
HDFS的優(yōu)點(diǎn)有很多腊凶,簡單介紹:
高容錯(cuò): 系統(tǒng)的數(shù)據(jù)自動(dòng)保存多個(gè)副本划咐, 在副本丟失后,可以自動(dòng)恢復(fù)
適合大數(shù)據(jù)批處理:系統(tǒng)通過API將數(shù)據(jù)位置暴露給計(jì)算框架钧萍,通過移動(dòng)計(jì)算不移動(dòng)數(shù)據(jù)的方式來處理大數(shù)據(jù)量的計(jì)算褐缠,可以存儲(chǔ)GB、TB甚至PB級(jí)別的數(shù)據(jù)风瘦,文件數(shù)量可達(dá)到百萬規(guī)模及以上队魏,目前實(shí)用的案例有超過上萬臺(tái)節(jié)點(diǎn)的部署
流式文件訪問:系統(tǒng)數(shù)據(jù)支持一次寫入,多次讀取万搔,并不支持隨機(jī)修改胡桨,通過多副本的方式來保證數(shù)據(jù)的一致性和完整性。
構(gòu)建成本低瞬雹,安全可靠 :系統(tǒng)部署在廉價(jià)的商用機(jī)器上昧谊,設(shè)備成本低,通過多副本的方式提高了系統(tǒng)的可靠性酗捌,并提供容錯(cuò)和恢復(fù)機(jī)制呢诬。
缺點(diǎn)
不適合低延遲數(shù)據(jù)訪問:系統(tǒng)以數(shù)據(jù)塊存儲(chǔ),通過犧牲訪問速度來換取高吞吐率胖缤,不適合對(duì)存取速度要求較高的場景尚镰。
不適合大量小文件存儲(chǔ):系統(tǒng)NameNode會(huì)存儲(chǔ)文件元數(shù)據(jù),小文件太多內(nèi)存占用過大哪廓,導(dǎo)致NameNode不可用狗唉,且小文件過多在讀取時(shí)會(huì)占用大量的尋道時(shí)間,讀取時(shí)間和尋道時(shí)間的比例不太好撩独。
不適合并發(fā)寫入:系統(tǒng)的一個(gè)文件只能有一個(gè)寫入者敞曹,不適合并發(fā)場景的寫入
不提供文件隨機(jī)修改:系統(tǒng)只支持追加數(shù)據(jù),不提供隨機(jī)修改操作
基本架構(gòu)與原理
HDFS以NameNode管理命名空間综膀,維護(hù)文件存儲(chǔ)的元數(shù)據(jù)信息澳迫,將存儲(chǔ)的數(shù)據(jù)按照固定大小切分成多塊,分別存儲(chǔ)多份數(shù)據(jù)剧劝,存放在不同的節(jié)點(diǎn)橄登, 通過Standby NameNode實(shí)現(xiàn)高可用,保證系統(tǒng)在Active NameNode掛掉的情況下還能夠?qū)ν馓峁┓?wù)讥此,以DataNode來存儲(chǔ)具體數(shù)據(jù)拢锹,DataNode通過心跳機(jī)制來向NameNode報(bào)告節(jié)點(diǎn)運(yùn)行狀態(tài)及存儲(chǔ)的數(shù)據(jù)等信息,HDFS默認(rèn)存儲(chǔ)的副本為3萄喳,如果因?yàn)楣?jié)點(diǎn)掛掉導(dǎo)致副本數(shù)量不足卒稳,系統(tǒng)會(huì)再復(fù)制數(shù)據(jù)來保證最低副本數(shù)。
概念
ActiveNameNode
系統(tǒng)的主節(jié)點(diǎn)他巨,只有一個(gè)充坑,主要作用是管理HDFS文件系統(tǒng)的命名空間,維護(hù)文件元數(shù)據(jù)信息染突,管理HDFS的副本策略捻爷,處理客戶端的讀寫請(qǐng)求
客戶端在向HDFS發(fā)送寫請(qǐng)求時(shí),NameNode首先將操作信息寫入edit日志份企,然后對(duì)數(shù)據(jù)進(jìn)行分塊也榄,向DataNode發(fā)送寫請(qǐng)求,在DataNode寫入大部分?jǐn)?shù)據(jù)(一半以上)司志,NameNode將元數(shù)據(jù)寫入內(nèi)存甜紫,fsimage定期將內(nèi)存內(nèi)容及edit日志同步并固化到磁盤(此過程理解不全,有疏漏敬請(qǐng)指正)
Standby NameNode
Active NameNode的熱備節(jié)點(diǎn)俐芯,它會(huì)周期性同步edits的編輯日志棵介,定期合并fsimage和eidts到本地磁盤,當(dāng)Active NameNode出現(xiàn)故障時(shí)吧史,集群可以幾乎無縫切換到Standby NameNode
NameNode元數(shù)據(jù)文件
NameNode元數(shù)據(jù)文件包括edits和fsimage邮辽,edits保存客戶端對(duì)文件的寫操作記錄,包括創(chuàng)建文件贸营、刪除文件吨述,fsimage為文件系統(tǒng)元數(shù)據(jù)的檢查點(diǎn)鏡像文件,保存了文件系統(tǒng)中的所有目錄和文件信息钞脂,如目錄結(jié)構(gòu)揣云、文件副本數(shù)、文件的塊信息等冰啃,NameNode中的內(nèi)存中保存著最新的鏡像信息邓夕,鏡像內(nèi)容為fsimage + edits刘莹,NameNode會(huì)定期將內(nèi)存中的數(shù)據(jù)增量備份到磁盤中
DataNode
slave的工作節(jié)點(diǎn),一般啟動(dòng)多個(gè)焚刚,可以靈活擴(kuò)展
存儲(chǔ)數(shù)據(jù)塊和數(shù)據(jù)校驗(yàn)和(對(duì)數(shù)據(jù)內(nèi)容進(jìn)行校驗(yàn)点弯,看數(shù)據(jù)內(nèi)容是否完整)
通過心跳機(jī)制定期向NameNode匯報(bào)運(yùn)行狀態(tài)和所有塊的列表信息
在集群啟動(dòng)時(shí)DataNode向NameNode提供存儲(chǔ)的Block塊的列表信息
Block數(shù)據(jù)塊
文件寫入HDFS會(huì)被切分成固定大小的Block塊
數(shù)據(jù)塊的大小固定,Hadoop2.0默認(rèn)128M矿咕,1.0默認(rèn)64MB抢肛,可自定義修改
Block數(shù)據(jù)塊是HDFS的最小存儲(chǔ)單元,定義的數(shù)據(jù)塊大小為數(shù)據(jù)切分的最大大小碳柱,如果大小不夠捡絮,以實(shí)際的來
默認(rèn)每個(gè)Block有三個(gè)副本
Client
客戶端,主要作用為文件切分莲镣,與NameNode交互獲取文件元數(shù)據(jù)信息福稳,與DataNode交互,讀取或?qū)懭霐?shù)據(jù)瑞侮,管理HDFS
HDFS為什么不適合存儲(chǔ)小文件
HDFS元數(shù)據(jù)信息存儲(chǔ)在NameNode的內(nèi)存中灵寺,內(nèi)存大小再大也有限制
NameNode存儲(chǔ)的Block數(shù)量有限(一個(gè)block元信息消耗大約150byte內(nèi)存,小文件過多区岗,占用的內(nèi)存太大略板,存的數(shù)據(jù)卻沒有多少,性價(jià)比不高)
存儲(chǔ)大量的小文件浪費(fèi)大量的磁盤尋道時(shí)間
HDFS的高可用
在Hadoop系統(tǒng)中慈缔,如果NameNode故障叮称,由于集群數(shù)據(jù)量大,重啟需要的時(shí)間將會(huì)很長藐鹤,HDFS使用Standby NameNode來解決這樣的問題瓤檐,主要的實(shí)現(xiàn)路徑有兩條,一條為NameNode的數(shù)據(jù)共享娱节,另外一條為NameNode故障時(shí)的主備切換
數(shù)據(jù)共享:
DataNode通過多副本的形式進(jìn)行數(shù)據(jù)備份挠蛉,NameNode則使用了Standby NameNode,在客戶端寫數(shù)據(jù)時(shí)肄满,Active NameNode除了寫edits谴古,也會(huì)同步阻塞寫JournalNode的eidt日志,只有大部分(二分之一)JournalNode的edit日志寫入成功稠歉,才會(huì)修改內(nèi)存中的數(shù)據(jù)信息掰担,之后數(shù)據(jù)才會(huì)修改。(JournalNode為一組輕量的NameNode和Standby NameNode進(jìn)行通信的進(jìn)程怒炸,它們組成了一套QIM共享存儲(chǔ)系統(tǒng),只負(fù)責(zé)存儲(chǔ)edit日志),Standby NameNode定期與JournalNode進(jìn)行同步更新內(nèi)存數(shù)據(jù)带饱,Active NameNode 和Standby NameNode都會(huì)定期將數(shù)據(jù)固化到fsimage中
主備切換:
準(zhǔn)備切換由DFSZKFailoverController(以下簡稱ZKFC)來控制,每個(gè)NameNode都有一個(gè)ZKFC進(jìn)程阅羹,ZKFC會(huì)同時(shí)構(gòu)建HealthMonitor和ActiveStandbyElector勺疼,HealthMonotor會(huì)通過RPC定期檢查NameNode的健康狀況教寂。
集群啟動(dòng)時(shí),ActiveStandbyElector都會(huì)主動(dòng)在Zookeeper創(chuàng)建臨時(shí)鎖節(jié)點(diǎn)执庐,寫入成功的NameNode即為Active孝宗,另外為Standby的,在運(yùn)行時(shí)Active NameNode發(fā)生故障/網(wǎng)絡(luò)延遲時(shí)耕肩,Zookeeper臨時(shí)節(jié)點(diǎn)刪除,Standby NameNode會(huì)嘗試創(chuàng)建臨時(shí)節(jié)點(diǎn)问潭,如果創(chuàng)建成功猿诸,則Standby NameNode會(huì)變成Active NameNode。另外狡忙,如果HealthMonitor監(jiān)測到Active NameNode機(jī)器故障梳虽,則通知ActiveStandbyElector進(jìn)行選舉,故障節(jié)點(diǎn)不參與選舉灾茁,主備會(huì)進(jìn)行切換Standby NameNode創(chuàng)建臨時(shí)節(jié)點(diǎn)
腦裂:Active NameNode會(huì)因?yàn)槠渌颍ㄈ缇W(wǎng)絡(luò)阻塞窜觉、Full GC)而與Zookeeper的會(huì)話超時(shí),導(dǎo)致假死北专,此時(shí)Standby NameNode切換為Active NameNode禀挫,但另外的Active NameNode恢復(fù)后也為Active NameNode這樣造成雙主現(xiàn)象,稱為腦裂拓颓。Hadoop會(huì)通過fencing機(jī)制语婴,首先會(huì)通過ssh把Active NameNode切換為Standby NameNode,如果失敗驶睦,則會(huì)強(qiáng)行將進(jìn)程kill砰左,如果再失敗,可配置bash腳本將服務(wù)器強(qiáng)行關(guān)機(jī)场航。
以上為HDFS的一些學(xué)習(xí)筆記缠导,如有遺漏,歡迎指正溉痢。
Yarn
Yarn是Yet Another Resource Negotiator的簡稱僻造,從Hadoop2.0開始引入的一個(gè)資源調(diào)度系統(tǒng),為了解決多框架下的資源及硬件的管理孩饼。
Yarn主要提供了資源管理嫡意,統(tǒng)一管理和調(diào)度集群資源,負(fù)責(zé)與客戶端交互捣辆,處理客戶端的請(qǐng)求蔬螟。
基本架構(gòu)
Yarn采用典型的Master-Slave架構(gòu),Master即ResourceManager汽畴,Slave即NodeManager旧巾,ResourceManager負(fù)責(zé)全局資源管理和調(diào)度耸序,NodeManager負(fù)責(zé)本機(jī)的資源管理,ResourceManager一般與DataNode一一對(duì)應(yīng)鲁猩,ResourceManager通過心跳定期與ResourceManager進(jìn)行通信坎怪,匯報(bào)機(jī)器的資源使用情況,ResourceManager在接收到作業(yè)請(qǐng)求后廓握,通過調(diào)度器分配一個(gè)Container(運(yùn)行任務(wù)所必需的資源的一個(gè)抽象容器)搅窿,然后協(xié)調(diào)NodeManager,分配到具體的NodeManager隙券,NodeManager啟動(dòng)一個(gè)ApplicationMaster男应,ApplicationMaster與ResourceManager通信申請(qǐng)資源,ResourceManager分配給ApplicationMaster資源娱仔,ResourceManager調(diào)度NodeManager資源進(jìn)行相應(yīng)的任務(wù)執(zhí)行沐飘,在任務(wù)執(zhí)行的過程中ApplicationMaster與ResourceManager進(jìn)行通信,匯報(bào)任務(wù)執(zhí)行情況牲迫,如果任務(wù)執(zhí)行失敗耐朴,會(huì)調(diào)度到其他機(jī)器進(jìn)行再次執(zhí)行。
為了集群高可用盹憎,ResourceManager也會(huì)啟動(dòng)一個(gè)備用的ResourceManager筛峭,它們基于Zookeeper實(shí)現(xiàn)高可用
核心組件
ResourceManager
整個(gè)集群只有一個(gè),主要用來處理客戶端請(qǐng)求陪每,啟動(dòng)/監(jiān)控ApplicationMaster蜒滩,監(jiān)控NodeManager,對(duì)資源進(jìn)行分配和調(diào)度
NodeManager
每個(gè)節(jié)點(diǎn)只有一個(gè)奶稠,集群中一般與DataNode一一對(duì)應(yīng)俯艰,在相同的機(jī)器上進(jìn)行部署,主要功能:單個(gè)節(jié)點(diǎn)的資源監(jiān)控和管理锌订;定時(shí)向ResourceManager匯報(bào)本機(jī)的資源使用情況竹握;處理ResourceManager的請(qǐng)求,為作業(yè)的執(zhí)行分配Container辆飘;處理來自ApplicationMaster的請(qǐng)求啦辐,啟動(dòng)和停止Container
ApplicationMaster
每個(gè)應(yīng)用程序只有一個(gè),負(fù)責(zé)應(yīng)用程序的管理蜈项,資源的申請(qǐng)和任務(wù)調(diào)度芹关,主要功能:與ResourceManager協(xié)商為應(yīng)用程序申請(qǐng)資源;與NodeManager通信啟動(dòng)/停止任務(wù)紧卒;監(jiān)控任務(wù)的運(yùn)行狀態(tài)和失敗處理
Container
任務(wù)運(yùn)行環(huán)境的抽象侥衬,只有在分配任務(wù)的時(shí)候才會(huì)抽象出一個(gè)Container,主要功能:描述一系列信息(任務(wù)運(yùn)行資源如節(jié)點(diǎn)、CPU轴总、內(nèi)存等)直颅;管理任務(wù)的啟停及任務(wù)的運(yùn)行環(huán)境
Yarn容錯(cuò)
Resource基于Zookeeper實(shí)現(xiàn)高可用
NodeManager故障會(huì)導(dǎo)致運(yùn)行在該節(jié)點(diǎn)運(yùn)行的任務(wù)失敗,任務(wù)失敗后怀樟,ResourceManager將失敗任務(wù)通知對(duì)應(yīng)的ApplicationMaster功偿,ApplicationMaster決定如何處理失敗的任務(wù)
ApplicationMaster失敗后,由ResourceManager負(fù)責(zé)重啟往堡,RMApplicationMaster會(huì)保存已經(jīng)運(yùn)行完成的Task,重啟后不需要重新運(yùn)行械荷。
補(bǔ)充:在超大規(guī)模的集群中,可以使用namenode federation來配置多個(gè)命名空間虑灰,但一般來說是不會(huì)用到的吨瞎,除了向百度,google這樣數(shù)據(jù)量超多的公司