(一)分布式文件系統(tǒng)概述
數(shù)據(jù)量越來越多律适,在一個操作系統(tǒng)管轄的范圍存不下了捂贿,那么就分配到更多的操作系統(tǒng)管理的磁盤中厂僧,但是不方便管理和維護,因此迫切需要一種系統(tǒng)來管理多臺機器上的文件白魂,這就是分布式文件管理系統(tǒng) 福荸。是一種允許文件通過網(wǎng)絡(luò)在多臺主機上分享的文件系統(tǒng)敬锐,可讓多機器上的多用戶分享文件和存儲空間。通透性。讓實際上是通過網(wǎng)絡(luò)來訪問文件的動作,由程序與用戶看來滚朵,就像是訪問本地的磁盤一般。 容錯移宅。即使系統(tǒng)中有某些節(jié)點脫機吞杭,整體來說系統(tǒng)仍然可以持續(xù)運作而不會有數(shù)據(jù)損失。分布式文件管理系統(tǒng)很多芽狗,hdfs只是其中一種绢掰,不合適小文件。
HttpFS訪問方式
1:httpfs是一個hadoop hdfs的一個http接口童擎,通過WebHDFS REST API 可以對hdfs進行讀寫等訪問
2:與WebHDFS的區(qū)別是不需要客戶端可以訪問hadoop集群的每一個節(jié)點滴劲,通過httpfs可以訪問放置在防火墻后面的hadoop集群
3:httpfs是一個Web應(yīng)用,部署在內(nèi)嵌的tomcat中
NFS:
The NFS Gateway supports NFSv3 and allows HDFS to be mounted as part of the client’s local file system. Currently NFS Gateway supports and enables the following usage patterns:
Users can browse the HDFS file system through their local file system? on NFSv3 client compatible operating systems.? Users can download files from the the HDFS file system on to their? local file system.? Users can upload files from their local file system directly to the? HDFS file system.? Users can stream data directly to HDFS through the mount point. File? append is supported but random write is not supported.
The NFS gateway machine needs the same thing to run an HDFS client like Hadoop JAR files, HADOOP_CONF directory. The NFS gateway can be on the same host as DataNode, NameNode, or any HDFS client.
HDFSNFSGateway能夠把HDFS掛載到客戶機上作為本地文件系統(tǒng)來管理,支持NFSv3顾复。當(dāng)前版本的NFSGateway有如下可用特性班挖。用戶在支持NFSv3的操作系統(tǒng)上可以通過本地文件系統(tǒng)瀏覽HDFS芯砸。使用NFSGateway用戶能夠直接下載和上傳HDFS文件到本地文件系統(tǒng)中萧芙。用戶可以通過掛載點直接傳輸數(shù)據(jù)流至HDFS,但只能增量添加不能隨機寫數(shù)據(jù)假丧。?
NameNode之間共享數(shù)據(jù)(NFS 双揪、QuorumJournalNode(用得多)):
兩個NameNode為了數(shù)據(jù)同步,會通過一組稱作JournalNodes的獨立進程進行相互通信包帚。當(dāng)active狀態(tài)的NameNode的命名空間有任何修改時渔期,會告知大部分的JournalNodes進程。standby狀態(tài)的NameNode有能力讀取JNs中的變更信息渴邦,并且一直監(jiān)控editlog的變化疯趟,把變化應(yīng)用于自己的命名空間。standby可以確保在集群出錯時谋梭,命名空間狀態(tài)已經(jīng)完全同步了信峻。
hadoop2.2.0(HA)中HDFS的高可靠指的是可以同時啟動2個NameNode。其中一個處于工作狀態(tài)瓮床,另一個處于隨時待命狀態(tài)站欺。這樣,當(dāng)一個NameNode所在的服務(wù)器宕機時纤垂,可以在數(shù)據(jù)不丟失的情況下矾策,手工或者自動切換到另一個NameNode提供服務(wù)。這些NameNode之間通過共享數(shù)據(jù)峭沦,保證數(shù)據(jù)的狀態(tài)一致贾虽。多個NameNode之間共享數(shù)據(jù),可以通過Nnetwork File System或者QuorumJournalNode吼鱼。前者是通過linux共享的文件系統(tǒng)蓬豁,屬于操作系統(tǒng)的配置绰咽;后者是hadoop自身的東西,屬于軟件的配置地粪。使用QuorumJournalNode的配置方式取募,方式是手工切換。
集群啟動時蟆技,可以同時啟動2個NameNode玩敏。這些NameNode只有一個是active的,另一個屬于standby狀態(tài)质礼。active狀態(tài)意味著提供服務(wù)旺聚,standby狀態(tài)意味著處于休眠狀態(tài),只進行數(shù)據(jù)同步眶蕉,時刻準(zhǔn)備著提供服務(wù)砰粹,如圖2所示。
在一個典型的HA集群中造挽,每個NameNode是一臺獨立的服務(wù)器碱璃。在任一時刻,只有一個NameNode處于active狀態(tài)饭入,另一個處于standby狀態(tài)嵌器。其中,active狀態(tài)的NameNode負(fù)責(zé)所有的客戶端操作圣拄,standby狀態(tài)的NameNode處于從屬地位嘴秸,維護著數(shù)據(jù)狀態(tài)毁欣,隨時準(zhǔn)備切換庇谆。
兩個NameNode為了數(shù)據(jù)同步,會通過一組稱作JournalNodes的獨立進程進行相互通信凭疮。當(dāng)active狀態(tài)的NameNode的命名空間有任何修改時饭耳,會告知大部分的JournalNodes進程。standby狀態(tài)的NameNode有能力讀取JNs中的變更信息执解,并且一直監(jiān)控edit log的變化寞肖,把變化應(yīng)用于自己的命名空間。standby可以確保在集群出錯時衰腌,命名空間狀態(tài)已經(jīng)完全同步了新蟆,如圖3所示。
為了確庇胰铮快速切換琼稻,standby狀態(tài)的NameNode有必要知道集群中所有數(shù)據(jù)塊的位置。為了做到這點饶囚,所有的datanodes必須配置兩個NameNode的地址帕翻,發(fā)送數(shù)據(jù)塊位置信息和心跳給他們兩個鸠补。
對于HA集群而言,確保同一時刻只有一個NameNode處于active狀態(tài)是至關(guān)重要的嘀掸。否則紫岩,兩個NameNode的數(shù)據(jù)狀態(tài)就會產(chǎn)生分歧,可能丟失數(shù)據(jù)睬塌,或者產(chǎn)生錯誤的結(jié)果泉蝌。為了保證這點,JNs必須確保同一時刻只有一個NameNode可以向自己寫數(shù)據(jù)衫仑。
為了部署HA集群梨与,應(yīng)該準(zhǔn)備以下事情:
* NameNode服務(wù)器:運行NameNode的服務(wù)器應(yīng)該有相同的硬件配置。
* JournalNode服務(wù)器:運行的JournalNode進程非常輕量文狱,可以部署在其他的服務(wù)器上粥鞋。注意:必須允許至少3個節(jié)點。當(dāng)然可以運行更多瞄崇,但是必須是奇數(shù)個呻粹,如3、5苏研、7等浊、9個等等。當(dāng)運行N個節(jié)點時摹蘑,系統(tǒng)可以容忍至少(N-1)/2(N至少為3)個節(jié)點失敗而不影響正常運行筹燕。
在典型的HA架構(gòu)中,有兩個獨立的機器作為Namenode衅鹿,任何時刻撒踪,只有一個Namenode處于Active狀態(tài),另一個處于standby狀態(tài)(passive,備份)大渤;Active Namenode用于接收Client端請求制妄,Standy節(jié)點作為slave保持集群的狀態(tài)數(shù)據(jù)以備快速failover。
為了支持快速failover,Standbynode持有集群中blocks的最新位置是非常必要的孩哑。為了達(dá)到這一目的栓霜,Datanodes上需要同時配置這兩個Namenode的地址,同時和它們都建立心跳鏈接横蜒,并把block位置發(fā)送給它們胳蛮。
任何時刻,只有一個Active Namenode是非常重要的丛晌,否則將會導(dǎo)致集群操作的混亂仅炊,那么兩個Namenode將會分別有兩種不同的數(shù)據(jù)狀態(tài),可能會導(dǎo)致數(shù)據(jù)丟失澎蛛,或者狀態(tài)異常抚垄,這種情況通常稱為“split-brain”(腦裂,三節(jié)點通訊阻斷谋逻,即集群中不同的Datanodes卻看到了兩個Active Namenodes)呆馁。對于JNS(JournalNodes)而言,任何時候只允許一個Namenode作為writer毁兆;在failover期間浙滤,原來的StandbyNode將會接管Active的所有職能,并負(fù)責(zé)向JNS寫入日志記錄气堕,這就阻止了其他Namenode基于處于Active狀態(tài)的問題纺腊。
自動Failover
上述介紹了如何配置手動failover,在這種模式下茎芭,系統(tǒng)不會自動觸發(fā)failover揖膜,即不會將Standby提升為Active,即使Active已經(jīng)失效骗爆。接下來介紹如何實現(xiàn)自動failover次氨。
一)蔽介、組件
Automatic Failover中摘投,增加了2個新的組件:zookeeper集群,ZKFailoverController進程(簡稱為ZKFC)虹蓄。 Zookeeper是一個高可用的調(diào)度服務(wù)犀呼,可以保存一系列調(diào)度數(shù)據(jù),當(dāng)這些數(shù)據(jù)變更(notify)時可以通知Client薇组,以及監(jiān)控(montitor)Clients失效外臂,自動failover的實現(xiàn)將依賴于Zookeeper的幾個特性:
1、Failure delection:失效檢測律胀,每個Namenode將會和zookeeper建立一個持久session宋光,如果Namenode失效貌矿,那么次session將會過期失效,此后Zookeeper將會通知另一個Namenode罪佳,然后觸發(fā)Failover逛漫。
2、Active Namenode election:zookeeper提供了簡單的機制來實現(xiàn)AcitveNode選舉赘艳,如果當(dāng)前Active失效酌毡,Standby將會獲取一個特定的排他鎖(lock),那么獲取(持有)鎖的Node接下來將會成為Active蕾管。
ZKFailoverControllor(ZKFC)是一個zookeeper客戶端枷踏,它主要用來監(jiān)測和管理Namenodes的狀態(tài),每個Namenode機器上都會運行一個ZKFC程序掰曾,它的職責(zé)為:1旭蠕、Health monitoring:ZKFC間歇性的使用health-check指令ping本地的Namenode,Namenode也會及時的反饋自己的health status旷坦。如果Namenode失效下梢,或者unhealthy,或者無響應(yīng)塞蹭,那么ZKFS將會標(biāo)記其為“unhealthy”孽江。
2、Zookeeper session manangement:當(dāng)本地Nanenode運行良好時番电,ZKFC將會持有一個zookeeper session岗屏,如果本地Namenode為Active,它同時也持有一個“排他鎖”(znode)漱办;這個lock在zookeeper中為“ephemeral” znode(臨時節(jié)點)这刷,如果session過期,那么次lock所對應(yīng)的znode也將被刪除娩井。
3暇屋、Zookeeper-based election:如果本地Namenode運行良好,并且ZKFS沒有發(fā)現(xiàn)其他的的Namenode持有l(wèi)ock(比如Active失效后洞辣,釋放了lock)咐刨,它將嘗試獲取鎖,如果獲取成功扬霜,即“贏得了選舉”定鸟,那么此后將會把本地Namenode標(biāo)記為Active,然后觸發(fā)Failover:首先著瓶,調(diào)用fencing method联予,然后提升本地Namenode 為Active。
在Automatic Failover中,需要把一個重要的配置項添加到hdfs-site.xml中沸久。dfs.ha.automatic-failover.enabled設(shè)置為true季眷,
1、ZKFC和Namenodes守護進程的啟動順序是否重要卷胯?
No瘟裸,對于指定的Namenode,你可以在其之前或者之后啟動ZKFC均可以诵竭,ZKFC只是調(diào)度Namenode的存活狀態(tài)话告,如果不啟動ZKFC,此Namenode將無法參與自動failover過程卵慰。
2沙郭、是否需要額外的monitoring?
你需要在Namenode機器上裳朋,添加額外的monitor用來監(jiān)控ZKFC是否運行病线。在某些情況下,zookeeper集群的故障可能導(dǎo)致ZKFC意外中斷鲤嫡,你需要適時的重啟ZKFC送挑。此外,還需要監(jiān)控Zookeeper集群的運行狀況暖眼,如果Zookeeper集群失效惕耕,那么HA集群將無法failover。
3诫肠、如果Zookeeper失效司澎,將會怎么樣?
如果zookeeper集群故障栋豫,那么Automatic Failover將不會觸發(fā)挤安,即使Namenode失效,這也意味著ZKFC無法正常運行丧鸯。不過蛤铜,如果Namenodes正常(即使有一個失效),那么HDFS系統(tǒng)將不會受到影響丛肢。因為HDFSClient并沒有基于zookeeper做任何事情围肥,當(dāng)zookeeper集群仍需要盡快的恢復(fù)以避免當(dāng)前Active失效而造成的“split-brain”等問題。
4摔踱、是否可以在Namenodes之間指定優(yōu)先級虐先?
NO怨愤,這是不能支持的派敷。首先啟動的Namenode將作為Active,我們只能認(rèn)為控制Namenode啟動的順序來做到“優(yōu)先級”。
5篮愉、在Automatic Failover中腐芍,手動Failover怎么做?
和普通的Failover一樣试躏,我們總是可以通過"hdfs haadmin -DFSHAAdmin -failover"來實現(xiàn)手動Failover猪勇。
在Automatic Failover中,需要把一個重要的配置項添加到hdfs-site.xml中颠蕴。
zkfailover:
1.基本原理
zk的基本特性:(1) 可靠存儲小量數(shù)據(jù)且提供強一致性 (2) ephemeral node, 在創(chuàng)建它的客戶端關(guān)閉后泣刹,可以自動刪除 (3) 對于node狀態(tài)的變化,可以提供異步的通知(watcher)
zk在zkfc中可以提供的功能:
(1) Failure detector: 及時發(fā)現(xiàn)出故障的NN犀被,并通知zkfc (2) Active node locator: 幫助客戶端定位哪個是Active的NN (3) Mutual exclusion of active state: 保證某一時刻只有一個Active的NN
2. 模塊
(1) ZKFailoverController(DFSZKFailoverController): 驅(qū)動整個ZKFC的運轉(zhuǎn)椅您,通過向HealthMonitor和ActiveStandbyElector注冊回調(diào)函數(shù)的方式,subscribe HealthMonitor和ActiveStandbyElector的事件寡键,并做相應(yīng)的處理
(2) HealthMonitor: 定期check NN的健康狀況掀泳,在NN健康狀況發(fā)生變化時,通過回調(diào)函數(shù)把變化通知給ZKFailoverController
(3) ActiveStandbyElector: 管理NN在zookeeper上的狀態(tài)西轩,zookeeper上對應(yīng)node的結(jié)點發(fā)生變化時员舵,通過回調(diào)函數(shù)把變化通知給ZKFailoverController
(4) FailoverController: 提供做graceful failover的相關(guān)功能(dfs admin可以通過命令行工具手工發(fā)起failover)
3. 系統(tǒng)架構(gòu)
如上圖所示,通常情況下Namenode和ZKFC同布署在同一臺物理機器上, HealthMonitor, FailoverController, ActiveStandbyElector在同一個JVM進程中(即ZKFC), Namenode是一個單獨的JVM進程藕畔。如上圖所示马僻,ZKFC在整個系統(tǒng)中有幾個重要的作用:
(1) Monitor and try to take active lock: 向zookeeper搶鎖,搶鎖成功的zkfc注服,指導(dǎo)對應(yīng)的NN成為active的NN; watch鎖對應(yīng)的znode巫玻,當(dāng)前active NN的狀態(tài)發(fā)生變化導(dǎo)致失鎖時,及時搶鎖祠汇,努力成為active NN
(2) Monitor NN liveness and health: 定期檢查對應(yīng)NN的狀態(tài), 當(dāng)NN狀態(tài)發(fā)生變化時仍秤,及時通過ZKFC做相應(yīng)的處理
(3) Fences other NN when needed: 當(dāng)前NN要成為active NN時,需要fence其它的NN可很,不能同時有多個active NN
4. 線程模型
ZKFC的線程模型總體上來講比較簡單的诗力,它主要包括三類線程,一是主線程我抠;一是HealthMonitor線程; 一是zookeeper客戶端的線程苇本。它們的主要工作方式是:
(1) 主線程在啟動所有的服務(wù)后就開始循環(huán)等待
(2) HealthMonitor是一個單獨的線程,它定期向NN發(fā)包菜拓,檢查NN的健康狀況
(3) 當(dāng)NN的狀態(tài)發(fā)生變化時瓣窄,HealthMonitor線程會回調(diào)ZKFailoverController注冊進來的回調(diào)函數(shù),通知ZKFailoverController NN的狀態(tài)發(fā)生了變化
(4) ZKFailoverController收到通知后纳鼎,會調(diào)用ActiveStandbyElector的API俺夕,來管理在zookeeper上的結(jié)點的狀態(tài)
(5) ActiveStandbyElector會調(diào)用zookeeper客戶端API監(jiān)控zookeeper上結(jié)點的狀態(tài)裳凸,發(fā)生變化時,回調(diào)ZKFailoverController的回調(diào)函數(shù)劝贸,通知ZKFailoverController姨谷,做出相應(yīng)的變化
5. 類關(guān)系圖
ZKFC的主類是org.apache.hadoop.hdfs.tools.DFSZKFailoverController。
formatZK 創(chuàng)建特定目錄映九,作為后續(xù)寫節(jié)點狀態(tài)的父路徑梦湘。如果該目錄已經(jīng)存在,清理原有目錄為空目錄件甥。
HealthMonitor 在一個獨立線程中捌议,通過RPC方式,周期性的調(diào)用HAServiceProtocol接口的monitorHealth方法引有,獲取NN的狀態(tài)禁灼。并把狀態(tài)報告給ActiveStandbyElector。
ActiveStandbyElector ActiveStandbyElector負(fù)責(zé)判斷哪個NN可以成為Active轿曙。它通過ZK弄捕,看哪個能夠成功的創(chuàng)建一個特定的ephemeral?lock?file?(znode),哪個就是Active导帝,其它的成為Standby守谓。在一個節(jié)點被通知變成Active后,它必須確保自己能夠提供一致性的服務(wù)(數(shù)據(jù)一致性)您单,否則它需要主動退出選舉斋荞。
如果一個Active因HealthMonitor監(jiān)控到狀態(tài)異常,這里會作出判斷虐秦,先通過Fenceing功能關(guān)閉它(確保關(guān)閉或者不能提供服務(wù))平酿,然后在ZK上刪除它對應(yīng)ZNode。發(fā)送上述事件后悦陋,在另外一臺機器上的ZKFC中的ActiveStandbyElector會收到事件蜈彼,并重新進行選舉(嘗試創(chuàng)建特定ZNode),它將獲得成功并更改NN中狀態(tài)俺驶,從而實現(xiàn)Active節(jié)點的變更幸逆。
HDFS體系結(jié)構(gòu)
Client客戶端+Namenode+DataNode
是整個文件系統(tǒng)的管理節(jié)點。它維護著1.整個文件系統(tǒng)的文件目錄樹暮现,2.文件/目錄的元信息和每個文件對應(yīng)的數(shù)據(jù)塊列表还绘。3.接收用戶的操作請求。文件包括:(hdfs-site.xml的dfs.namenode.name.dir屬性)
fsimage:元數(shù)據(jù)鏡像文件栖袋。存儲某一時段NameNode內(nèi)存元數(shù)據(jù)信息拍顷。edits:操作日志文件。fstime:保存最近一次checkpoint的時間 以上這些文件是保存在linux的文件系統(tǒng)中塘幅。
NameNode維護著2張表:
1.文件系統(tǒng)的目錄結(jié)構(gòu)昔案,以及元數(shù)據(jù)信息尿贫;2.文件與數(shù)據(jù)塊(block)列表的對應(yīng)關(guān)系
元數(shù)據(jù)存放在fsimage中,在運行的時候加載到內(nèi)存中的(讀寫比較快)爱沟。操作日志寫到edits中帅霜。(類似于LSM樹中的log)
(剛開始的寫文件會寫入到內(nèi)存中和edits中匆背,edits會記錄文件系統(tǒng)的每一步操作呼伸,當(dāng)達(dá)到一定的容量會將其內(nèi)容寫入fsimage中)
dfs.namenode.name.dir -- /lvm/dfs/nn
/lvm/dfs/nn/current 保存有fsimage和edit文件? 確定namenode在本地文件系統(tǒng)上的DFS名稱節(jié)點應(yīng)存儲名稱表(fsimage)。 fsimage的內(nèi)容會被存儲到以逗號分隔的列表的目錄中钝尸,然后在所有的目錄中復(fù)制名稱表目錄括享,用于冗余。
查看NameNode內(nèi)容
啟動服務(wù)器bin/hdfs oiv -i 某個fsimage文件 --offline image viewer? -i(input) -o(output)
查看內(nèi)容bin/hdfs dfs -ls -R webhdfs://127.0.0.1:5978/
導(dǎo)出結(jié)果bin/hdfs oiv -p XML -i tmp/dfs/name/current/fsimage_0000000000000000055 -o fsimage.xml
查看edtis內(nèi)容bin/hdfs oev -i tmp/dfs/name/current/edits_0000000000000000057-0000000000000000186 -o edits.xml
2.Datanode
提供真實文件數(shù)據(jù)的存儲服務(wù)珍促。
文件塊(block):最基本的存儲單位铃辖。對于文件內(nèi)容而言,一個文件的長度大小是size猪叙,那么從文件的0偏移開始娇斩,按照固定的大小,順序?qū)ξ募M行劃分并編號穴翩,劃分好的每一個塊稱一個Block犬第。HDFS默認(rèn)Block大小是128MB(dfs.blocksize,dfs.block.size),以一個256MB文件芒帕,共有256/128=2個Block. 不同于普通文件系統(tǒng)的是歉嗓,HDFS中,如果一個文件小于一個數(shù)據(jù)塊的大小背蟆,并不占用整個數(shù)據(jù)塊存儲空間鉴分。(這樣設(shè)置可以減輕namenode壓力,因為namonode維護者文件與數(shù)據(jù)塊列表的對應(yīng)大小) Replication带膀。多復(fù)本志珍。默認(rèn)是三個。(hdfs-site.xml的dfs.replication屬性).注意區(qū)別:一個文件可以產(chǎn)生多個塊垛叨,多個文件是不可能成為一個塊信息的碴裙,處于減輕namenode的壓力,最好的方式就是一個文件一個塊.
文件塊存放路徑查看與具體信息解釋
(a)查找datanode存放數(shù)據(jù)的位置点额,配置信息在hdfs-site.xml中
cd /lvm/data8/dfs/dn/current/BP-625280320-192.168.191.130-1483628038952/current/finalized/subdir0/subdir0
DataNode:使用block形式存儲舔株。在hadoop2中,默認(rèn)的大小是128MB还棱。使用副本形式保存數(shù)據(jù)的安全载慈,默認(rèn)的數(shù)量是3個。