1. 當前HDFS架構和功能概述
我們先回顧一下HDFS功能。HDFS實際上具有兩個功能:命名空間管理(Namespace management)和塊/存儲管理服務(block/storage management)。
1.1 命名空間管理
HDFS的命名空間包含目錄、文件和塊。命名空間管理:是指命名空間支持對HDFS中的目錄、文件和塊做類似文件系統的創建、修改、刪除、列表文件和目錄等基本操作。
1.2 塊/存儲管理
在塊存儲服務中包含兩部分工作:塊管理和物理存儲。這是一個更通用的存儲服務。其他的應用可以直接建立在Block Storage上,如HBase,Foreign Namespaces等。
1.2.1 塊管理
A) 處理Data Node向Name Node註冊的請求,處理datanode的成員關係,處理來自Data Node週期性的心跳。
B) 處理來自塊的報告信息,維護塊的位置信息。
C) 處理與塊相關的操作:塊的創建、刪除、修改及獲取塊信息。
D) 管理副本放置(replica placement)和塊的複製及多餘塊的刪除。
1.2.2 物理存儲
所謂物理存儲就是:Data Node把塊存儲到本地文件系統中,對本地文件系統的讀、寫。
1.3 當前HDFS的架構
在當前的HDFS架構中(Hadoop v0.23之前),在整個HDFS集羣中只有一個命名空間,並且只有單獨的一個Name Node,這個Name Node負責對這單獨的一個命名空間進行管理。這也正是單點失效(Single Point Failure)的隱患所在。本文所講的HDFS Federation就是針對當前HDFS架構上的缺陷所做的改進,簡單說HDFS Federation就是使得HDFS支持多個命名空間,並且允許在HDFS中同時存在多個Name Node。
簡單回顧一下目前HDFS的架構,如下圖所示。在整個HDFS集羣中只有一個Namenode,還有一個Backup Namenode。Namenode會實時將變化的HDFS的信息同步給Backup Namenode。Backup Namenode顧名思義是用來做Namenode的備份的。Namenode中命名空間以層次結構組織中存儲着文件名和BlockID的對應關係、BlockID和具體Block位置的對應關係。這個單獨的Namenode管理着數個Datanode,Block分佈在各個Datanode中,每個Datanode會週期性的向此Namenode發送心跳消息,報告自己所在Datanode的使用狀態。Block是用來存儲數據的最小單元,通常一個文件會存儲在一個或者多個Block中,默認Block大小爲64MB。
2. 單個Namenode的HDFS架構的侷限性
2.1 Namespace(命名空間)的限制
2.2 性能的瓶頸
2.3 隔離問題
2.4 集羣的可用性
2.5 Namespace和Block Management的緊密耦合
2.6 爲什麼縱向擴展目前的Namenode不可行?比如將Namenode的Heap空間擴大到512GB。
3. 爲什麼要引入Federation
引入Federation的最主要原因是簡單,其簡單性是與真正的分佈式Namenode相比而言的。Federation能夠快速的解決了大部分單Namenode HDFS的問題。
Federation是簡單魯棒的設計,由於聯盟中各個Namenode之間是相互獨立的。Federation整個核心設計實現大概用了3.5個月。大部分改變是在Datanode、Config和Tools,而Namenode本身的改動非常少,這樣Namenode原先的魯棒性不會受到影響。比分佈式的Namenode簡單,雖然這種實現的擴展性比起真正的分佈式的Namenode要小些,但是可以迅速滿足需求。另外一個原因是Federation良好的向後兼容性,已有的單Namenode的部署配置不需要任何改變就可以繼續工作。
4. HDFS Federation
4.1 Federation HDFS與當前HDFS的比較
- 當前HDFS只有一個命名空間(Namespace),它使用全部的塊。而Federation HDFS中有多個獨立的命名空間(Namespace),並且每一個命名空間使用一個塊池(block pool)。
- 當前HDFS中只有一組塊。而Federation HDFS中有多組獨立的塊。塊池(block pool)就是屬於同一個命名空間的一組塊。
- 當前HDFS由一個Namenode和一組datanode組成。而Federation HDFS由多個Namenode和一組datanode,每一個datanode會爲多個塊池(block pool)存儲塊。
4.2 Block Pool(塊池)
所謂Block pool(塊池)就是屬於單個命名空間的一組block(塊)。每一個datanode爲所有的block pool存儲塊。Datanode是一個物理概念,而block pool是一個重新將block劃分的邏輯概念。同一個datanode中可以存着屬於多個block pool的多個塊。Block pool允許一個命名空間在不通知其他命名空間的情況下爲一個新的block創建Block ID。同時,一個Namenode失效不會影響其下的datanode爲其他Namenode的服務。
當datanode與Namenode建立聯繫並開始會話後自動建立Block pool。每個block都有一個唯一的標識,這個標識我們稱之爲擴展的塊ID(Extended Block ID)= BlockID+BlockID。這個擴展的塊ID在HDFS集羣之間都是唯一的,這爲以後集羣歸併創造了條件。
Datanode中的數據結構都通過塊池ID(BlockPoolID)索引,即datanode中的BlockMap,storage等都通過BPID索引。
在HDFS中,所有的更新、回滾都是以Namenode和BlockPool爲單元發生的。即同一HDFS Federation中不同的Namenode/BlockPool之間沒有什麼關係。
Hadoop V0.23版本中Block Pool的管理功能依然放在了Namenode中,將來的版本中會將Block Pool的管理功能移動的新的功能節點中。
4.3 Datanode的改進
在datanode中,對應於每個Namnode都有一條相應的線程。每個datanode會去每一個Namenode註冊,並且週期性的給所有的Namenode發送心跳及datanode的使用報告。Datanode還會給Namenode發送其所在的block pool的block report(塊報告)。由於有多個Namenode同時存在,因此任何一個Namenode都可以隨時動態加入、刪除和更新。
4.4 Federation中的其他方面的改進
- 提供了工具,對於Namenode的初始化和退役的監控和管理。
- 允許在datanode級別或者block pool級別的負載均衡。
- Datanode的後臺守護進程,爲Federation所做的磁盤和目錄掃描。
- 提供了顯示Namenode的Block pool的使用狀態的Web UI。
- 還提供了對全部集羣存儲使用狀態的UI展示。
- 在Web UI中列出了所有的Namenode及其細節,如Namenode-BlockPoolID和存儲的使用狀態,失去聯繫的、活的和死的塊信息。還有前往各個Namenode Web UI的鏈接。
- Datanode退役狀態的展示。
4.5 多命名空間的管理問題
如上圖所示,每個深色三角形代表一個獨立的命名空間,上方淺色的三角形代表從客戶角度去訪問下方的子命名空間。各個深色的命名空間Mount到淺色的表中,客戶可以訪問不同的掛載點來訪問不同的命名空間,這就如同在Linux系統中訪問不同掛載點一樣。這就是HDFS Federation中命名空間管理的基本原理:將各個命名空間掛載到全局mount-table中,就可以做將數據到全局共享;同樣的命名空間掛載到個人的mount-table中,這就成爲應用程序可見的命名空間視圖。
4.6 Namespace Volume(命名空間卷)
4.7 ClusterID
在HDFS Federation中添加了Cluster ID用來區分集羣中的每個節點。當格式化一個Namenode時,這個ClusterID會自動生成或者手動提供。在格式化同一集羣中其他Namenode時會用到這個ClusterID。
4.8 HDFS Federation對老版本的HDFS是兼容的
這種兼容性可以使得已有的Namenode配置不需要任何改變繼續工作。
具體的如何配置和管理Federation HDFS,請參考 http://hadoop.apache.org/common/docs/r0.23.0/hadoop-yarn/hadoop-yarn-site/Federation.html#Federation_Configuration 。
Note:Federation只是爲Namenode的橫向擴展提供了支持,並沒有能解決namenode的單點故障問題,所以我覺得還是需要使用HA+Federation來搭建集羣!讓zookeeper集羣來管理單個的namenode/namespace集羣.
參考資料:
Hadoop is here: http://hortonworks.com/apache-hadoop-is-here
HDFS Federation: http://www.slideshare.net/ydn/hug-march-hdfs-federation
HDFS Federation: http://hadoop.apache.org/common/docs/r0.23.0/hadoop-yarn/hadoop-yarn-site/Federation.html
HDFS Federation hadoop submit 2011: http://www.slideshare.net/huguk/hdfs-federation-hadoop-summit2011
An Introduction to HDFS Federation: http://hortonworks.com/an-introduction-to-hdfs-federation/