hadoop深入研究:(一)——hdfs介紹

hdfs設計原則

1.非常大的文件:

這裏的非常大是指幾百MB,GB,TB.雅虎的Hadoop集羣已經可以存儲PB級別的數據

2.流式數據訪問:

基於一次寫,多次讀。

3.商用硬件:      

 hdfs的高可用是用軟件來解決,因此不需要昂貴的硬件來保障高可用性,各個生產商售賣的pc或者虛擬機即可。

hdfs不適用的場景

1.低延遲的數據訪問   
hdfs的強項在於大量的數據傳輸,遞延遲不適合他,10毫秒以下的訪問可以無視hdfs,不過hbase可以彌補這個缺陷。

2.太多小文件              
 namenode節點在內存中hold住了整個文件系統的元數據,因此文件的數量就會受到限制,每個文件的元數據大約150字節
 1百萬個文件,每個文件只佔一個block,那麼就需要300MB內存。你的服務器可以hold住多少呢,你可以自己算算

3.多處寫和隨機修改   
目前還不支持多處寫入以及通過偏移量隨機修改

hdfs block

爲了最小化查找時間比例,hdfs的塊要比磁盤的塊大很多。hdfs塊的大小默認爲64MB,和文件系統的塊不同,
hdfs的文件可以小於塊大小,並且不會佔滿整個塊大小。
查找時間在10ms左右,數據傳輸機率在100MB/s,爲了使查找時間是傳輸時間的1%,塊的大小必須在100MB左右
一般都會設置爲128MB

有了塊的抽象之後,hdfs有了三個優點:

1.可以存儲比單個磁盤更大的文件
2.存儲塊比存儲文件更加簡單,每個塊的大小都基本相同
3.使用塊比文件更適合做容錯性和高可用

namenodes和datanodes

hdfs集羣有兩種類型的節點,一種爲master及namenode,另一種爲worker及datanodes。

namenode節點管理文件系統的命名空間。它包含一個文件系統的樹,所有文件和目錄的原數據都在這個樹上,這些
信息被存儲在本地磁盤的兩個文件中,image文件和edit log文件。文件相關的塊存在哪個塊中,塊在哪個地方,這些
信息都是在系統啓動的時候加載到namenode的內存中,並不會存儲在磁盤中。

datanode節點在文件系統中充當的角色就是苦力,按照namenode和client的指令進行存儲或者檢索block,並且週期性
的向namenode節點報告它存了哪些文件的block

namenode節點如果不能使用了,那麼整個hdfs就玩完了。爲了防止這種情況,有兩種方式可供選擇
1.namenode通過配置元數據可以寫到多個磁盤中,最好是獨立的磁盤,或者NFS.
2.使用第二namenode節點,第二namenode節點平時並不作爲namenode節點工作,它的主要工作內容就是定期根據編輯
日誌(edit log)合併命名空間的鏡像(namespace image),防止編輯日誌過大,合併後的image它自己也保留一份,等着
namenode節點掛掉,然後它可以轉正,由於不是實時的,有數據上的損失是很可能發生的。

hdfs Federation

namenode節點保持所有的文件和塊的引用在內存中,這就意味着在一個擁有很多很多文件的很大的集羣中,內存就成爲了一個
限制的條件,hdfs federation在hadoop 2.x的被實現了,允許hdfs有多個namenode節點,每個管hdfs的一部分,比如一個管/usr,
另一個管/home,每個namenode節點是相互隔離的,一個掛掉不會影響另外一個。

hdfs的高可用

不管namenode節點的備份還是第二namenode節點都只能保證數據的恢復,並不能保證hdfs的高可用性,一旦namenode節點掛掉
就會產生單點故障,這時候要手動去數據備份恢復,或者啓用第二節點,新的namenode節點在對外服務器要做三件事:
1.把命名空間的鏡像加載到內存中
2.重新運行編輯日誌
3.接受各個datanode節點的block報告
在一個大型一點的hdfs系統中,等這些做完需要30分鐘左右。

2.x已經支持了高可用性(HA),通過一對namenode熱備來實現,一臺掛掉,備機馬上提供無中斷服務
要實現HA,要做三點微調:
1.namenode節點必須使用高可用的共享存儲。
2.datanode節點必須象兩個namenode節點發送block報告
3.客戶端做改動可以在故障時切換到可用的namenode節點上,而且要對用戶是無感知的

failover和fencing

將備份namenode激活的過程就叫failover,管理激活備份namenode的系統叫做failover controller,
zookeeper就可以擔當這樣的角色,可以保證只有一個節點處於激活狀態。
必須確認原來的namenode已經真的掛掉了,很多時候只是網絡延遲,如果備份節點已經激活了,
原來的節點又可以提供服務了,這樣是不行的,防止原來namenode活過來的過程就叫fencing。
可以用STONITH實現, STONITH可以做到直接斷電把原namenode節點fencing掉


感謝Tom White,此文章大部分來自於大神的definitive guide,奈何中文版翻譯太爛,就在英文原版的基礎上和官方的一些文檔加入一些自己的理解。
全當是讀書筆記吧,畫蛇添足之舉。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章