掌握HDFS2的新特性:HA和Federation
一、HDFS的新特性HA
(一)HDFS的HA機(jī)制
Hadoop 2.2.0 版本之前,NameNode是HDFS集群的單點故障點,每一個集群只有一個NameNode ,如果這個機(jī)器或者進(jìn)程不可用,整個集群就無法使用,直到重啟NameNode或者新重啟一個NameNode節(jié)點 。
影響HDFS集群不可用主要包括以下兩種情況:
(1)類似機(jī)器跌宕這樣的意外情況將導(dǎo)致集群不可用,只有重啟NameNode之后才可使用。
(2) 計劃內(nèi)的軟件或硬件升級(NameNode節(jié)點)將導(dǎo)致集群在短時間范圍內(nèi)不可用。
HDFS的高可用性(HA ,High Availability)就可以解決上述問題,通過提供選擇運行在同一集群中的一個熱備用的 "主/備"兩個冗余NameNode,允許在機(jī)器宕機(jī)或系統(tǒng)維護(hù)的時候,快速轉(zhuǎn)移到另一個NameNode。
(二)典型的HA集群
一個典型的HA集群,兩個單獨的機(jī)器配置為NameNodes,在任何時候,一個NameNode處于活動狀態(tài),另一個處于待機(jī)狀態(tài),活動的NameNode負(fù)責(zé)處理集群中所有客戶端的操作,待機(jī)時僅僅作為一個slave,保持足夠的狀態(tài),如果有必要提供一個快速的故障轉(zhuǎn)移。
為了保持備用節(jié)點與活動節(jié)點狀態(tài)的同步,目前的實現(xiàn)需要兩個節(jié)點同時訪問一個共享存儲設(shè)備(例如從NASNFS掛載)到一個目錄。將有可能在未來的版本中放寬此限制。
當(dāng)活動節(jié)點對命名空間進(jìn)行任何修改,它將把修改記錄寫到共享目錄下的一個日志文件,備用節(jié)點會監(jiān)聽這個目錄,當(dāng)發(fā)現(xiàn)更改時,它會把修改內(nèi)容同步到自己的命名空間。備用節(jié)點在故障轉(zhuǎn)移時,它將保證已經(jīng)讀取了所有共享目錄內(nèi)的更改記錄,保證在發(fā)生故障前的狀態(tài)與活動節(jié)點保持完全一致。
為了提供快速的故障轉(zhuǎn)移,必須保證備用節(jié)點有最新的集群中塊的位置信息,為了達(dá)到這一點,Datanode節(jié)點需要配置兩個nameNode的位置,同時發(fā)送塊的位置信息和心跳信息到兩個nameNode。
任何時候只有一個namenode處于活動狀態(tài),對于HA集群的操作是至關(guān)重要的,否則兩個節(jié)點之間的狀態(tài)就會產(chǎn)生沖突,數(shù)據(jù)丟失或其它不正確的結(jié)果,為了達(dá)到這個目的或者所謂的“裂腦場景”出現(xiàn),管理員必須為共享存儲配置至少一個(fencing)方法。在宕機(jī)期間,如果不能確定之間的活動節(jié)點已經(jīng)放棄活動狀態(tài),fencing進(jìn)程負(fù)責(zé)中斷以前的活動節(jié)點編輯存儲的共享訪問。這可以防止任何進(jìn)一步的修改命名空間,允許新的活動節(jié)點安全地進(jìn)行故障轉(zhuǎn)移。
(三)HA架構(gòu)
HA架構(gòu)解釋如下:
1、只有一個NameNode是Active的,并且只有這個ActiveNameNode能提供服務(wù),改變NameNode。以后可以考慮讓StandbyNameNode提供讀服務(wù)。
2、提供手動Failover,在升級過程中,F(xiàn)ailover在NameNode-DataNode之間寫不變的情況下才能生效。
3、在之前的NameNode重新恢復(fù)之后,不能提供failback。
4、數(shù)據(jù)一致性比Failover更重要。
5、盡量少用特殊的硬件。
6、HA的設(shè)置和Failover都應(yīng)該保證在兩者操作錯誤或者配置錯誤的時候,不得導(dǎo)致數(shù)據(jù)損壞。
7、NameNode的短期垃圾回收不應(yīng)該觸發(fā)Failover。
8、DataNode會同時向NameNodeActive和NameNodeStandby匯報塊的信息。NameNodeActive和NameNodeStandby通過NFS備份MetaData信息到一個磁盤上面。
(四)為什么會有HA機(jī)制
1、單點故障
在Hadoop 2.0之前,也有若干技術(shù)試圖解決單點故障的問題,我們在這里做個簡短的總結(jié)
A、Secondary NameNode。它不是HA,它只是階段性的合并edits和fsimage,以縮短集群啟動的時間。當(dāng)NameNode(以下簡稱NN)失效的時候,Secondary NN并無法立刻提供服務(wù),Secondary NN甚至無法保證數(shù)據(jù)完整性:如果NN數(shù)據(jù)丟失的話,在上一次合并后的文件系統(tǒng)的改動會丟失。
B、Backup NameNode (HADOOP-4539)。它在內(nèi)存中復(fù)制了NN的當(dāng)前狀態(tài),算是Warm Standby,可也就僅限于此,并沒有failover等。它同樣是階段性的做checkpoint,也無法保證數(shù)據(jù)完整性。
C、手動把name.dir指向NFS。這是安全的Cold Standby,可以保證元數(shù)據(jù)不丟失,但集群的恢復(fù)則完全靠手動。
D、Facebook AvatarNode。Facebook有強(qiáng)大的運維做后盾,所以Avatarnode只是Hot Standby,并沒有自動切換,當(dāng)主NN失效的時候,需要管理員確認(rèn),然后手動把對外提供服務(wù)的虛擬IP映射到Standby NN,這樣做的好處是確保不會發(fā)生腦裂的場景。其某些設(shè)計思想和Hadoop 2.0里的HA非常相似,從時間上來看,Hadoop 2.0應(yīng)該是借鑒了Facebook的做法。
E、還有若干解決方案,基本都是依賴外部的HA機(jī)制,譬如DRBD,Linux HA,VMware的FT等等。
2、集群容量和集群性能
單NN的架構(gòu)使得HDFS在集群擴(kuò)展性和性能上都有潛在的問題,當(dāng)集群大到一定程度后,NN進(jìn)程使用的內(nèi)存可能會達(dá)到上百G,常用的估算公式為1G對應(yīng)1百萬個塊,按缺省塊大小計算的話,大概是64T (這個估算比例是有比較大的富裕的,其實,即使是每個文件只有一個塊,所有元數(shù)據(jù)信息也不會有1KB/block)。同時,所有的元數(shù)據(jù)信息的讀取和操作都需要與NN進(jìn)行通信,譬如客戶端的addBlock、getBlockLocations,還有DataNode的blockRecieved、sendHeartbeat、blockReport,在集群規(guī)模變大后,NN成為了性能的瓶頸。Hadoop 2.0里的HDFS Federation就是為了解決這兩個問題而開發(fā)的。
二、HDFS的新特性Federation
(一)單個Namenode的HDFS架構(gòu)的局限性
1. Namespace(命名空間)的限制
由于Namenode在內(nèi)存中存儲所有的元數(shù)據(jù)(metadata),因此單個Namenode所能存儲的對象(文件+塊)數(shù)目受到Namenode所在JVM的heap size的限制。50G的heap能夠存儲20億(200 million)個對象,這20億個對象支持4000個datanode,12PB的存儲(假設(shè)文件平均大小為40MB)。 隨著數(shù)據(jù)的飛速增長,存儲的需求也隨之增長。單個datanode從4T增長到36T,集群的尺寸增長到8000個datanode。存儲的需求從12PB增長到大于100PB。
2. 性能的瓶頸
由于是單個Namenode的HDFS架構(gòu),因此整個HDFS文件系統(tǒng)的吞吐量受限于單個Namenode的吞吐量。毫無疑問,這將成為下一代MapReduce的瓶頸。
3. 隔離問題
由于HDFS僅有一個Namenode,無法隔離各個程序,因此HDFS上的一個實驗程序就很有可能影響整個HDFS上運行的程序。那么在HDFS Federation中,可以用不同的Namespace來隔離不同的用戶應(yīng)用程序,使得不同Namespace Volume中的程序相互不影響。
4. 集群的可用性
在只有一個Namenode的HDFS中,此Namenode的宕機(jī)無疑會導(dǎo)致整個集群不可用。
5. Namespace和Block Management的緊密耦合
當(dāng)前在Namenode中的Namespace和Block Management組合的緊密耦合關(guān)系會導(dǎo)致如果想要實現(xiàn)另外一套Namenode方案比較困難,而且也限制了其他想要直接使用塊存儲的應(yīng)用。
6. 為什么縱向擴(kuò)展目前的Namenode不可行?比如將Namenode的Heap空間擴(kuò)大到512GB。
這樣縱向擴(kuò)展帶來的第一個問題就是啟動問題,啟動花費的時間太長。當(dāng)前具有50GB Heap Namenode的HDFS啟動一次大概需要30分鐘到2小時,那512GB的需要多久? 第二個潛在的問題就是Namenode在Full GC時,如果發(fā)生錯誤將會導(dǎo)致整個集群宕機(jī)。 第三個問題是對大JVM Heap進(jìn)行調(diào)試比較困難。優(yōu)化Namenode的內(nèi)存使用性價比比較低。
(二) 為什么要引入Federation
引入Federation的最主要原因是簡單,其簡單性是與真正的分布式Namenode相比而言的。Federation能夠快速的解決了大部分單Namenode HDFS的問題。
Federation是簡單魯棒的設(shè)計,由于聯(lián)盟中各個Namenode之間是相互獨立的。Federation整個核心設(shè)計實現(xiàn)大概用了3.5個月。大部分改變是在Datanode、Config和Tools,而Namenode本身的改動非常少,這樣Namenode原先的魯棒性不會受到影響。比分布式的Namenode簡單,雖然這種實現(xiàn)的擴(kuò)展性比起真正的分布式的Namenode要小些,但是可以迅速滿足需求。另外一個原因是Federation良好的向后兼容性,已有的單Namenode的部署配置不需要任何改變就可以繼續(xù)工作。
因此Federation(聯(lián)盟)是未來可選的方案之一。在Federation架構(gòu)中可以無縫的支持目前單Namenode架構(gòu)中的配置。
(三)HDFS的Federation機(jī)制
HDFS Federation使用了多個獨立的Namenode/namespace來使得HDFS的命名服務(wù)能夠水平擴(kuò)展。在HDFS Federation中的Namenode之間是聯(lián)盟關(guān)系,他們之間相互獨立且不需要相互協(xié)調(diào)。HDFS Federation中的Namenode提供了提供了命名空間和塊管理功能。HDFS Federation中的datanode被所有的Namenode用作公共存儲塊的地方。每一個datanode都會向所在集群中所有的Namenode注冊,并且會周期性的發(fā)送心跳和塊信息報告,同時處理來自Namenode的指令。
(四)Federation HDFS與當(dāng)前HDFS的比較及改進(jìn)
當(dāng)前HDFS只有一個命名空間(Namespace),它使用全部的塊。而Federation HDFS中有多個獨立的命名空間(Namespace),并且每一個命名空間使用一個塊池(block pool)。
當(dāng)前HDFS中只有一組塊。而Federation HDFS中有多組獨立的塊。塊池(block pool)就是屬于同一個命名空間的一組塊。
當(dāng)前HDFS由一個Namenode和一組datanode組成。而Federation HDFS由多個Namenode和一組datanode,每一個datanode會為多個塊池(block pool)存儲塊。
1.Block Pool(塊池)
所謂Block pool(塊池)就是屬于單個命名空間的一組block(塊)。每一個datanode為所有的block pool存儲塊。Datanode是一個物理概念,而block pool是一個重新將block劃分的邏輯概念。同一個datanode中可以存著屬于多個block pool的多個塊。Block pool允許一個命名空間在不通知其他命名空間的情況下為一個新的block創(chuàng)建Block ID。同時,一個Namenode失效不會影響其下的datanode為其他Namenode的服務(wù)。 當(dāng)datanode與Namenode建立聯(lián)系并開始會話后自動建立Block pool。每個block都有一個唯一的標(biāo)識,這個標(biāo)識我們稱之為擴(kuò)展的塊ID(Extended Block ID)= BlockID+BlockID。這個擴(kuò)展的塊ID在HDFS集群之間都是唯一的,這為以后集群歸并創(chuàng)造了條件。
Datanode中的數(shù)據(jù)結(jié)構(gòu)都通過塊池ID(BlockPoolID)索引,即datanode中的BlockMap,storage等都通過BPID索引。 在HDFS中,所有的更新、回滾都是以Namenode和BlockPool為單元發(fā)生的。即同一HDFS Federation中不同的Namenode/BlockPool之間沒有什么關(guān)系。 Hadoop V0.23版本中Block Pool的管理功能依然放在了Namenode中,將來的版本中會將Block Pool的管理功能移動的新的功能節(jié)點中。
2.Datanode的改進(jìn)
在datanode中,對應(yīng)于每個Namnode都有一條相應(yīng)的線程。每個datanode會去每一個Namenode注冊,并且周期性的給所有的Namenode發(fā)送心跳及datanode的使用報告。Datanode還會給Namenode發(fā)送其所在的block pool的block report(塊報告)。由于有多個Namenode同時存在,因此任何一個Namenode都可以隨時動態(tài)加入、刪除和更新。
3.Federation中的其他方面的改進(jìn)
提供了工具,對于Namenode的初始化和退役的監(jiān)控和管理。 允許在datanode級別或者block pool級別的負(fù)載均衡。 Datanode的后臺守護(hù)進(jìn)程,為Federation所做的磁盤和目錄掃描。 提供了顯示Namenode的Block pool的使用狀態(tài)的Web UI。 還提供了對全部集群存儲使用狀態(tài)的UI展示。 在Web UI中列出了所有的Namenode及其細(xì)節(jié),如Namenode-BlockPoolID和存儲的使用狀態(tài),失去聯(lián)系的、活的和死的塊信息。還有前往各個Namenode Web UI的鏈接。 Datanode退役狀態(tài)的展示。
4.多命名空間的管理問題
在一個集群中需要唯一的命名空間還是多個命名空間,核心問題命名空間中數(shù)據(jù)的共享和訪問的問題。使用全局唯一的命名空間是解決數(shù)據(jù)共享和訪問的一種方法。在多命名空間下,我們還可以使用Client Side Mount Table方式做到數(shù)據(jù)共享和訪問。
5.Namespace Volume(命名空間卷)
一個Namespace和它的Block Pool合在一起稱作Namespace Volume。Namespace Volume是一個獨立完整的管理單元。當(dāng)一個Namenode/Namespace被刪除,與之相對應(yīng)的Block Pool也也被刪除。在升級時每一個Namespace Volume也會整體作為一個單元。
6.ClusterID
在HDFS Federation中添加了Cluster ID用來區(qū)分集群中的每個節(jié)點。當(dāng)格式化一個Namenode時,這個ClusterID會自動生成或者手動提供。在格式化同一集群中其他Namenode時會用到這個ClusterID。
7.HDFS Federation對老版本的HDFS是兼容的
這種兼容性可以使得已有的Namenode配置不需要任何改變繼續(xù)工作。
Hadoop 存儲
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。