HDFS Federation (讀書筆記)

HDFS Federation (讀書筆記)


HDFS的架構

HDFS包含兩個層次:命名空間管理(Namespace) 和 塊/存儲管理(Block Storage)。node

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

  • 塊/存儲管理(Block Storage)
    在塊存儲服務中包含兩部分工做:塊管理和物理存儲。這是一個更通用的存儲服務。其餘的應用能夠直接創建在Block Storage上,如HBase,Foreign Namespaces等。
    • 塊管理
      • 處理Data Node向Name Node註冊的請求,處理datanode的成員關係,處理來自Data Node週期性的心跳。
      • 處理來自塊的報告信息,維護塊的位置信息。
      • 處理與塊相關的操做:塊的建立、刪除、修改及獲取塊信息。
      • 管理副本放置(replica placement)和塊的複製及多餘塊的刪除。
    • 物理存儲
      所謂物理存儲就是:Data Node把塊存儲到本地文件系統中,對本地文件系統的讀、寫。

oldHDFSArchiteture

整個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。架構

HDFS架構的侷限

當前HDFS架構只容許整個集羣中存在一個namespace,而該namespace被僅有的一個namenode管理。這個架構使得HDFS很是容易實現,可是,它在具體實現過程當中耦合度比較高,進而致使了不少侷限性,固然這些侷限性只有在擁有規模大集羣的公司,像baidu,騰訊等出現。HDFS的侷限性主要爲:併發

  • Block Storage和namespace高耦合
    當前namenode中的namespace和block management的結合使得這兩層架構耦合在一塊兒,難以讓其餘可能namenode實現方案直接使用block storage。
  • namenode擴展性
    HDFS的底層存儲是能夠水平擴展的(解釋:底層存儲指的是datanode,當集羣存儲空間不夠時,可簡單的添加機器已進行水平擴展),但namespace不能夠。當前的namespace只能存放在單個namenode上,而namenode在內存中存儲了整個分佈式文件系統中的元數據信息,這限制了集羣中數據塊,文件和目錄的數目。
  • 性能
    文件操做的性能制約於單個namenode的吞吐量,單個namenode當前僅支持約60K的task,而下一代Apache MapReduce將支持多餘100K的併發任務,這隱含着要支持多個namenode。
  • 隔離性
    如今大部分公司的集羣都是共享的,天天有來自不一樣group的不一樣用戶提交做業。單個namenode難以提供隔離性,即:某個用戶提交的負載很大的job會減慢其餘用戶的job,單一的namenode難以像HBase按照應用類別將不一樣做業分派到不一樣namenode上。

HDFS Federation

概述

HDFS Federation是Hadoop最新發布版本Hadoop-0.23.0中爲解決HDFS單點故障而提出的namenode水平擴展方案。該方案容許HDFS建立多個namespace以提升集羣的擴展性和隔離性。採用Federation的最主要緣由是簡單,Federation可以快速的解決了大部分單Namenode的問題。負載均衡

HDFS Federation架構

federation
爲了水平擴展namenode,federation使用了多個獨立的namenode/namespace。這些namenode之間是聯合的,也就是說,他們之間相互獨立且不須要互相協調,各自分工,管理本身的區域。分佈式的datanode被用做通用的數據塊存儲存儲設備。每一個datanode要向集羣中全部的namenode註冊,且週期性地向全部namenode發送心跳和塊報告,並執行來自全部namenode的命令。
一個block pool由屬於同一個namespace的數據塊組成,每一個datanode可能會存儲集羣中全部block pool的數據塊。
每一個block pool內部自治,也就是說各自管理各自的block,不會與其餘block pool交流。一個namenode掛掉了,不會影響其餘namenode。
某個namenode上的namespace和它對應的block pool一塊兒被稱爲namespace volume(命名空間卷)。它是管理的基本單位。當一個namenode/nodespace被刪除後,其全部datanode上對應的block pool也會被刪除。當集羣升級時,每一個namespace volume做爲一個基本單元進行升級。分佈式

Federation關鍵技術點

  • 命名空間管理
    Federation中存在多個命名空間,如何劃分和管理這些命名空間很是關鍵。在Federation中並採用「文件名hash」的方法,由於該方法的locality很是差,好比:查看某個目錄下面的文件,若是採用文件名hash的方法存放文件,則這些文件可能被放到不一樣namespace中,HDFS須要訪問全部namespace,代價過大。爲了方便管理多個命名空間,HDFS Federation採用了經典的Client Side Mount Table。
    client-side-mount-table
    如上圖所示,下面四個深色三角形表明一個獨立的命名空間,上方淺色的三角形表明從客戶角度去訪問的子命名空間。各個深色的命名空間Mount到淺色的表中,客戶能夠訪問不一樣的掛載點來訪問不一樣的命名空間,這就如同在Linux系統中訪問不一樣掛載點同樣。這就是HDFS Federation中命名空間管理的基本原理:將各個命名空間掛載到全局mount-table中,就能夠作將數據到全局共享;一樣的命名空間掛載到我的的mount-table中,這就成爲應用程序可見的命名空間視圖。ide

  • 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的管理功能移動的新的功能節點中。oop

主要優勢

  • 擴展性和隔離性
    支持多個namenode水平擴展整個文件系統的namespace。可按照應用程序的用戶和種類分離namespace volume,進而加強了隔離性。
  • 通用存儲服務
    Block Pool抽象層爲HDFS的架構開啓了創新之門。分離block storage layer使得:
    • 新的文件系統(non-HDFS)能夠在block storage上構建
    • 新的應用程序(如HBase)能夠直接使用block storage層
    • 分離的block storage層爲未來徹底分佈式namespace打下基礎
  • 設計簡單
    Federation 整個核心設計實現大概用了4個月。大部分改變是在Datanode、Config和Tools中,而Namenode自己的改動很是少,這樣 Namenode原先的魯棒性不會受到影響。雖然這種實現的擴展性比起真正的分佈式的Namenode要小些,可是能夠迅速知足需求,另外Federation具備良好的向後兼容性,已有的單Namenode的部署配置不須要任何改變就能夠繼續工做

HDFS Federation不足

  • 單點故障問題
    HDFS Federation並無徹底解決單點故障問題。雖然namenode/namespace存在多個,可是從單個namenode/namespace看,仍然存在單點故障:若是某個namenode掛掉了,其管理的相應的文件便不能夠訪問。Federation中每一個namenode仍然像以前HDFS上實現同樣,配有一個secondary namenode,以便主namenode掛掉一下,用於還原元數據信息。
  • 負載均衡問題
    HDFS Federation採用了Client Side Mount Table分攤文件和負載,該方法更多的須要人工介入已達到理想的負載均衡。

引用資料

http://zh.hortonworks.com/blog/an-introduction-to-hdfs-federation/
http://dongxicheng.org/mapreduce/hdfs-federation-introduction/
http://blog.csdn.net/strongerbit/article/details/7013221/性能

注:本博客引用了上面的博客內容,若有侵權,請聯繫博主。spa

相關文章
相關標籤/搜索