HDFS Federation
HDFS Federation是Hadoop最新發布版本Hadoop-0.23.0中為解決HDFS單點故障而提出的namenode水平擴展方案。該方案允許HDFS創建多個namespace以提高集群的擴展性和隔離性。本篇文章主要介紹了HDFS Federation的設計動機和基本原理。
背景
- Namespace 管理目錄,文件和數據塊。它支持常見的文件系統操作,如創建文件,修改文件,刪除文件等。
- Block Storage 由兩部分組成:Block Management維護集群中datanode的基本關系,它支持數據塊相關的操作,如:創建數據塊,刪除數據塊等,同時,它也會管理副本的復制和存放。Physical Storage存儲實際的數據塊并提供針對數據塊的讀寫服務。
以前的HDFS架構只允許一個集群擁有一個命名空間,一個Namenode管理著整個命名空間。HDFS Federation通過向HDFS增加多Namenode和namespace來解決這種限制。
HDFS Federation
為了水平擴展name service,Federation使用了獨立的多Namenode/Namespaces的架構。這些namenode之間是聯合的,也就是說,他們之間相互獨立且不需要互相協調,各自分工,管理自己的區域。(The Namenodes are federated; the Namenodes are independent and do not require coordination with each other.)Datanode被用作是存儲設備,在集群中,每一個Datanode都在Namenodes上注冊。Datanodes周期性的發送心跳包和關于塊的報告。Datanodes也要處理來自Namenodes的命令。
幾個關鍵的概念
- Block Pool 塊池,一個Block Pool是屬于同一個namespace下的一組塊集合。每個datanode可能會存儲集群中所有Block Pool的數據塊。(Datanodes store blocks for all the block pools in the cluster.)每個Block Pool的管理是獨立的。這樣的好處是,允許一個namespace為一個新的塊生成一個Block IDs,而不需要和其他的namespace進行協調。一個namenode掛掉了,不會影響其他namenode。
- Namespace Volume 一個namespace和它的Block Pool一起被統稱為Namespace Volume。它是管理的最小單元。當一個Namenode/namespace被刪除之后,每個Datanode上相應的Block Pool也會被刪除。每個Namespace Volume是升級的最小的一個單元。
- ClusterID 一個新的標識ClusterID添加到集群,用來標記所有的Nodes,當Namenode格式化時(formated),將會自動創建ClusterID,這個ID用來區分集群中的Namenodes。
Namespace的管理
Federation中存在多個命名空間,如何劃分和管理這些命名空間非常關鍵。在Federation中并采用“文件名hash”的方法,因為該方法的locality非常差,比如:查看某個目錄下面的文件,如果采用文件名hash的方法存放文件,則這些文件可能被放到不同namespace中,HDFS需要訪問所有namespace,代價過大。為了方便管理多個命名空間,HDFS Federation采用了經典的Client Side Mount Table。
如圖三所示,下面四個深色三角形代表一個獨立的命名空間,上方淺色的三角形代表從客戶角度去訪問的子命名空間。各個深色的命名空間Mount到淺色的表中,客戶可以訪問不同的掛載點來訪問不同的命名空間,這就如同在Linux系統中訪問不同掛載點一樣。這就是HDFS Federation中命名空間管理的基本原理:將各個命名空間掛載到全局mount-table中,就可以做將數據到全局共享;同樣的命名空間掛載到個人的mount-table中,這就成為應用程序可見的命名空間視圖。
HDFS Federation的優勢
- 命名空間的擴展.因為隨著集群使用時間的加長,HDFS上存放的數據也將會越來越多.這個時候如果還是將所有的數據都往一個NameNode上存放,這個文件系統會顯得非常的龐大.這時候我們可以進行橫向擴展,把一些大的目錄分離出去.使得每個NameNode下的數據看起來更加的精簡。
- 性能的提升.這個也很好理解.當NameNode所持有的數據量達到了一個非常大規模的量級的時候(比如超過1億個文件),這個時候NameNode的處理效率可能就會有影響,它可能比較容易的會陷入一個繁忙的狀態.而整個集群將會受限于一個單點NameNode的處理效率,從而影響集群整體的吞吐量.這個時候多NameNode機制顯然可以減輕很多這部分的壓力。
- 資源的隔離.這一點考慮的就比較深了.通過多個命名空間,我們可以將關鍵數據文件目錄移到不同的NameNode上,以此不讓這些關鍵數據的讀寫操作受到其他普通文件讀寫操作的影響.也就是說這些NameNode將會只處理特定的關鍵的任務所發來的請求,而屏蔽了其他普通任務的文件讀寫請求,以此做到了資源的隔離.千萬不要小看這一點,當你發現NameNode正在處理某個不良任務的大規模的請求操作導致響應速度極慢時,你一定會非常的懊惱。