HDFS Federation(HDFS 聯盟)介紹

1. 當前HDFS架構和功能概述

咱們先回顧一下HDFS功能。HDFS實際上具備兩個功能:命名空間管理(Namespace management)和塊/存儲管理服務(block/storage management)。node


1.1 命名空間管理

HDFS的命名空間包含目錄、文件和塊。命名空間管理:是指命名空間支持對HDFS中的目錄、文件和塊作相似文件系統的建立、修改、刪除、列表文件和目錄等基本操做。數據結構


1.2 塊/存儲管理

在塊存儲服務中包含兩部分工做:塊管理物理存儲。這是一個更通用的存儲服務。其餘的應用能夠直接創建在Block Storage上,如HBase,Foreign Namespaces等。架構


1.2.1 塊管理

A) 處理Data Node向Name Node註冊的請求,處理datanode的成員關係,處理來自Data Node週期性的心跳。負載均衡

B) 處理來自塊的報告信息,維護塊的位置信息。分佈式

C) 處理與塊相關的操做:塊的建立、刪除、修改及獲取塊信息。ide

D) 管理副本放置(replica placement)和塊的複製及多餘塊的刪除。工具


1.2.2 物理存儲

所謂物理存儲就是:Data Node把塊存儲到本地文件系統中,對本地文件系統的讀、寫。oop


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(命名空間)的限制

因爲Namenode在內存中存儲全部的元數據(metadata),所以單個Namenode所能存儲的對象(文件+塊)數目受到 Namenode所在JVM的heap size的限制。50G的heap可以存儲20億(200 million)個對象,這20億個對象支持4000個datanode,12PB的存儲(假設文件平均大小爲40MB)。

隨着數據的飛速增加,存儲的需求也隨之增加。單個datanode從4T增加到36T,集羣的尺寸增加到8000個datanode。存儲的需求從12PB增加到大於100PB。


2.2 性能的瓶頸

因爲是單個Namenode的HDFS架構,所以整個HDFS文件系統的吞吐量受限於單個Namenode的吞吐量。毫無疑問,這將成爲下一代MapReduce的瓶頸。


2.3 隔離問題

因爲HDFS僅有一個Namenode,沒法隔離各個程序,所以HDFS上的一個實驗程序就頗有可能影響整個HDFS上運行的程序。那麼在 HDFS Federation中,能夠用不一樣的Namespace來隔離不一樣的用戶應用程序,使得不一樣Namespace Volume中的程序相互不影響。


2.4 集羣的可用性

在只有一個Namenode的HDFS中,此Namenode的宕機無疑會致使整個集羣不可用。


2.5 Namespace和Block Management的緊密耦合

當前在Namenode中的Namespace和Block Management組合的緊密耦合關係會致使若是想要實現另一套Namenode方案比較困難,並且也限制了其餘想要直接使用塊存儲的應用。


2.6 爲何縱向擴展目前的Namenode不可行?好比將Namenode的Heap空間擴大到512GB。

這樣縱向擴展帶來的第一個問題就是啓動問題,啓動花費的時間太長。當前具備50GB Heap Namenode的HDFS啓動一次大概須要30分鐘到2小時,那512GB的須要多久?

第二個潛在的問題就是Namenode在Full GC時,若是發生錯誤將會致使整個集羣宕機。

第三個問題是對大JVM Heap進行調試比較困難。優化Namenode的內存使用性價比比較低。


3. 爲何要引入Federation

引入Federation的最主要緣由是簡單,其簡單性是與真正的分佈式Namenode相比而言的。Federation可以快速的解決了大部分單Namenode HDFS的問題。

Federation是簡單魯棒的設計,因爲聯盟中各個Namenode之間是相互獨立的。Federation 整個核心設計實現大概用了3.5個月。大部分改變是在Datanode、Config和Tools,而Namenode自己的改動很是少,這樣 Namenode原先的魯棒性不會受到影響。比分佈式的Namenode簡單,雖然這種實現的擴展性比起真正的分佈式的Namenode要小些,可是能夠 迅速知足需求。另一個緣由是Federation良好的向後兼容性,已有的單Namenode的部署配置不須要任何改變就能夠繼續工做。

所以Federation(聯盟)是將來可選的方案之一。在Federation架構中能夠無縫的支持目前單Namenode架構中的配置。


4. HDFS Federation

HDFS Federation使用了多個獨立的Namenode/namespace來使得HDFS的命名服務可以水平擴展。在HDFS Federation中的Namenode之間是聯盟關係,他們之間相互獨立且不須要相互協調。HDFS Federation中的Namenode提供了提供了命名空間和塊管理功能。HDFS Federation中的datanode被全部的Namenode用做公共存儲塊的地方。每個datanode都會向所在集羣中全部的 Namenode註冊,而且會週期性的發送心跳和塊信息報告,同時處理來自Namenode的指令。



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 多命名空間的管理問題

在一個集羣中須要惟一的命名空間仍是多個命名空間,核心問題命名空間中數據的共享和訪問的問題。使用全局惟一的命名空間是解決數據共享和訪問的一種方法。在多命名空間下,咱們還可使用Client Side Mount Table方式作到數據共享和訪問。


如上圖所示,每一個深色三角形表明一個獨立的命名空間,上方淺色的三角形表明從客戶角度去訪問下方的子命名空間。各個深色的命名空間Mount到淺色 的表中,客戶能夠訪問不一樣的掛載點來訪問不一樣的命名空間,這就如同在Linux系統中訪問不一樣掛載點同樣。這就是HDFS Federation中命名空間管理的基本原理:將各個命名空間掛載到全局mount-table中,就能夠作將數據到全局共享;一樣的命名空間掛載到我的的mount-table中,這就成爲應用程序可見的命名空間視圖


4.6 Namespace Volume(命名空間卷)

一個Namespace和它的Block Pool合在一塊兒稱做Namespace Volume。Namespace Volume是一個獨立完整的管理單元。當一個Namenode/Namespace被刪除,與之相對應的Block Pool也也被刪除。在升級時每個Namespace Volume也會總體做爲一個單元。


4.7 ClusterID

在HDFS Federation中添加了Cluster ID用來區分集羣中的每一個節點。當格式化一個Namenode時,這個ClusterID會自動生成或者手動提供。在格式化同一集羣中其餘Namenode時會用到這個ClusterID。


4.8 HDFS Federation對老版本的HDFS是兼容的

這種兼容性可使得已有的Namenode配置不須要任何改變繼續工做。

相關文章
相關標籤/搜索