1. 程式人生 > >HBase原理介紹

HBase原理介紹

bigtable 滿了 關註 線程 hdf 配置 管理 hlog 分享圖片

1、 HBase簡介

HBase是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC Server上搭建大規模結構化的存儲集群。HBase的目標是存儲並處理大型數據,具體來說是僅需使用普通的硬件配置,就能夠處理由成千上萬的行和列所組成的大型數據。

與MapReduce的離線批處理計算框架不同,HBase是一個可以隨機訪問的存儲和檢索數據平臺,彌補了HDFS不能隨機訪問數據的缺陷,適合實時性要求不是非常高的業務場景。HBase存儲的都是Byte數組,它不介意數據類型,允許動態、靈活的數據模型。

其中HBase位於結構化存儲層,HDFS為HBase提供了高可靠性的底層存儲支持, MapReduce為HBase提供了高性能的批處理能力,Zookeeper為HBase提供了穩定服務和failover機制,Pig和Hive為HBase提供了進行數據統計處理的高層語言支持,Sqoop則為HBase提供了便捷的RDBMS數據導入功能,使業務數據從傳統數據庫向HBase遷移變的非常方便。

2 、HBase體系結構

2.1 設計思路

HBase是一個分布式的數據庫,使用Zookeeper管理集群,使用HDFS作為底層存儲。在架構層面上由HMaster(Zookeeper選舉產生的Leader)和多個HRegionServer組成

在HBase的概念中,HRegionServer對應集群中的一個節點,一個HRegionServer負責管理多個HRegion,而一個HRegion代表一張表的一部分數據。在HBase中,一張表可能會需要很多個HRegion來存儲數據,每個HRegion中的數據並不是雜亂無章的。HBase在管理HRegion的時候會給每個HRegion定義一個Rowkey的範圍,落在特定範圍內的數據將交給特定的Region,從而將負載分攤到多個節點,這樣就充分利用了分布式的優點和特性。另外,HBase會自動調節Region所處的位置,如果一個HRegionServer過熱,即大量的請求落在這個HRegionServer管理的HRegion上,HBase就會把HRegion移動到相對空閑的其它節點,依次保證集群環境被充分利用。

2.2 基本架構

HBase由HMaster和HRegionServer組成,同樣遵從主從服務器架構。HBase將邏輯上的表劃分成多個數據塊即HRegion,存儲在HRegionServer中。HMaster負責管理所有的HRegionServer,它本身並不存儲任何數據,而只是存儲數據到HRegionServer的映射關系(元數據)。集群中的所有節點通過Zookeeper進行協調,並處理HBase運行期間可能遇到的各種問題。HBase的基本架構如下圖所示:

技術分享圖片

Hbase基本架構圖2

Client

使用HBase的RPC機制與HMaster和HRegionServer進行通信,提交請求和獲取結果。對於管理類操作,Client與HMaster進行RPC;對於數據讀寫類操作,Client與HRegionServer進行RPC。

Zookeeper

通過將集群各節點狀態信息註冊到Zookeeper中,使得HMaster可隨時感知各個HRegionServer的健康狀態,而且也能避免HMaster的單點問題。

HMaster

管理所有的HRegionServer,告訴其需要維護哪些HRegion,並監控所有HRegionServer的運行狀態。當一個新的HRegionServer登錄到HMaster時,HMaster會告訴它等待分配數據;而當某個HRegion死機時,HMaster會把它負責的所有HRegion標記為未分配,然後再把它們分配到其他HRegionServer中。HMaster沒有單點問題,HBase可以啟動多個HMaster,通過Zookeeper的選舉機制保證集群中總有一個HMaster運行,從而提高了集群的可用性。

HRegion

當表的大小超過預設值的時候,HBase會自動將表劃分為不同的區域,每個區域包含表中所有行的一個子集。對用戶來說,每個表是一堆數據的集合,靠主鍵(RowKey)來區分。從物理上來說,一張表被拆分成了多塊,每一塊就是一個HRegion。我們用表名+開始/結束主鍵,來區分每一個HRegion,一個HRegion會保存一個表中某段連續的數據,一張完整的表數據是保存在多個HRegion中的。

HRegionServer

HBase中的所有數據從底層來說一般都是保存在HDFS中的,用戶通過一系列HRegionServer獲取這些數據。集群一個節點上一般只運行一個HRegionServer,且每一個區段的HRegion只會被一個HRegionServer維護。HRegionServer主要負責響應用戶I/O請求,向HDFS文件系統讀寫數據,是HBase中最核心的模塊。HRegionServer內部管理了一系列HRegion對象,每個HRegion對應了邏輯表中的一個連續數據段。HRegion由多個HStore組成,每個HStore對應了邏輯表中的一個列族的存儲,可以看出每個列族其實就是一個集中的存儲單元。因此,為了提高操作效率,最好將具備共同I/O特性的列放在一個列族中。

HStore

它是HBase存儲的核心,由MemStore和StoreFiles兩部分組成。MemStore是內存緩沖區,用戶寫入的數據首先會放入MemStore,當MemStore滿了以後會Flush成一個StoreFile(底層實現是HFile),當StoreFile的文件數量增長到一定閾值後,會觸發Compact合並操作,將多個StoreFiles合並成一個StoreFile,合並過程中會進行版本合並和數據刪除操作。因此,可以看出HBase其實只有增加數據,所有的更新和刪除操作都是在後續的Compact過程中進行的,這樣使得用戶的寫操作只要進入內存就可以立即返回,保證了HBaseI/O的高性能。當StoreFiles Compact後,會逐步形成越來越大的StoreFile,當單個StoreFile大小超過一定閾值後,會觸發Split操作,同時把當前的HRegion Split成2個HRegion,父HRegion會下線,新分出的2個子HRegion會被HMaster分配到相應的HRegionServer,使得原先1個HRegion的負載壓力分流到2個HRegion上。

HLog

每個HRegionServer中都有一個HLog對象,它是一個實現了Write Ahead Log的預寫日誌類。在每次用戶操作將數據寫入MemStore的時候,也會寫一份數據到HLog文件中,HLog文件會定期滾動刷新,並刪除舊的文件(已持久化到StoreFile中的數據)。當HMaster通過Zookeeper感知到某個HRegionServer意外終止時,HMaster首先會處理遺留的 HLog文件,將其中不同HRegion的HLog數據進行拆分,分別放到相應HRegion的目錄下,然後再將失效的HRegion重新分配,領取到這些HRegion的HRegionServer在加載 HRegion的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然後Flush到StoreFiles,完成數據恢復。

2.3 ROOT表和META表

HBase的所有HRegion元數據被存儲在.META.表中,隨著HRegion的增多,.META.表中的數據也會增大,並分裂成多個新的HRegion。為了定位.META.表中各個HRegion的位置,把.META.表中所有HRegion的元數據保存在-ROOT-表中,最後由Zookeeper記錄-ROOT-表的位置信息。 所有客戶端訪問用戶數據前,需要首先訪問Zookeeper獲得-ROOT-的位置,然後訪問-ROOT-表獲得.META.表的位置,最後根據.META.表中的信息確定用戶數據存放的位置,如下圖所示。

技術分享圖片

ROOT表和META表

-ROOT-表永遠不會被分割,它只有一個HRegion,這樣可以保證最多只需要三次跳轉就可以定位任意一個HRegion。為了加快訪問速度,.META.表的所有HRegion全部保存在內存中。客戶端會將查詢過的位置信息緩存起來,且緩存不會主動失效。如果客戶端根據緩存信息還訪問不到數據,則詢問相關.META.表的Region服務器,試圖獲取數據的位置,如果還是失敗,則詢問-ROOT-表相關的.META.表在哪裏。最後,如果前面的信息全部失效,則通過ZooKeeper重新定位HRegion的信息。所以如果客戶端上的緩存全部是失效,則需要進行6次網絡來回,才能定位到正確的HRegion。

3、 HBase數據模型

HBase是一個類似於BigTable的分布式數據庫,它是一個稀疏的長期存儲的(存在HDFS上)、多維度的、排序的映射表。這張表的索引是行關鍵字、列關鍵字和時間戳。HBase的數據都是字符串,沒有類型。

技術分享圖片

Hbase數據模型

可以將一個表想象成一個大的映射關系,通過行鍵、行鍵+時間戳或行鍵+列(列族:列修飾符),就可以定位特定數據。由於HBase是稀疏存儲數據的,所以某些列可以是空白的。上表給出了com.cnn.www網站的數據存放邏輯視圖,表中僅有一行數據,行的唯一標識為“com.cnn.www”,對這行數據的每一次邏輯修改都有一個時間戳關聯對應。表中共有四列:contents:html、anchor:cnnsi.com、anchor:my.look.ca、mime:type,每一列以前綴的方式給出其所屬的列族。

行鍵(RowKey)是數據行在表中的唯一標識,並作為檢索記錄的主鍵。在HBase中訪問表中的行只有三種方式:通過某個行鍵訪問、給定行鍵的範圍訪問、全表掃描。行鍵可以是任意字符串(最大長度64KB)並按照字典序進行存儲。對於那些經常一起讀取的行,需要對鍵值精心設計,以便它們能放在一起存儲。

4 、HBase讀寫流程

技術分享圖片

HRegionServer數據存儲關系圖

上文提到,HBase使用MemStore和StoreFile存儲對表的更新。數據在更新時首先寫入HLog和MemStore。MemStore中的數據是排序的,當MemStore累計到一定閾值時,就會創建一個新的MemStore,並且將老的MemStore添加到Flush隊列,由單獨的線程Flush到磁盤上,成為一個StoreFile。與此同時,系統會在Zookeeper中記錄一個CheckPoint,表示這個時刻之前的數據變更已經持久化了。當系統出現意外時,可能導致MemStore中的數據丟失,此時使用HLog來恢復CheckPoint之後的數據。

StoreFile是只讀的,一旦創建後就不可以再修改。因此Hbase的更新其實是不斷追加的操作。當一個Store中的StoreFile達到一定閾值後,就會進行一次合並操作,將對同一個key的修改合並到一起,形成一個大的StoreFile。當StoreFile的大小達到一定閾值後,又會對 StoreFile進行切分操作,等分為兩個StoreFile。

4.1 寫操作流程

1. Client通過Zookeeper的調度,向HRegionServer發出寫數據請求,在HRegion中寫數據。

2. 數據被寫入HRegion的MemStore,直到MemStore達到預設閾值。

3. MemStore中的數據被Flush成一個StoreFile。

4. 隨著StoreFile文件的不斷增多,當其數量增長到一定閾值後,觸發Compact合並操作,將多個StoreFile合並成一個StoreFile,同時進行版本合並和數據刪除。

5. StoreFiles通過不斷的Compact合並操作,逐步形成越來越大的StoreFile。

6. 單個StoreFile大小超過一定閾值後,觸發Split操作,把當前HRegion Split成2個新的HRegion。父HRegion會下線,新Split出的2個子HRegion會被HMaster分配到相應的HRegionServer 上,使得原先1個HRegion的壓力得以分流到2個HRegion上。

4.2 讀操作流程

1. client訪問Zookeeper,查找-ROOT-表,獲取.META.表信息。

2. 從.META.表查找,獲取存放目標數據的HRegion信息,從而找到對應的HRegionServer。

3. 通過HRegionServer獲取需要查找的數據。

4. HRegionserver的內存分為MemStore和BlockCache兩部分,MemStore主要用於寫數據,BlockCache主要用於讀數據。讀請求先到MemStore中查數據,查不到就到BlockCache中查,再查不到就會到StoreFile上讀,並把讀的結果放入BlockCache。

5 、HBase使用場景

半結構化或非結構化數據:

對於數據結構字段不夠確定或雜亂無章,很難按一個概念去進行抽取的數據適合用HBase。如隨著業務發展需要存儲更多的字段時,RDBMS需要停機維護更改表結構,而HBase支持動態增加。

記錄非常稀疏:

RDBMS的行有多少列是固定的,為空的列浪費了存儲空間。而HBase為空的列不會被存儲,這樣既節省了空間又提高了讀性能。

多版本數據:

根據RowKey和列標識符定位到的Value可以有任意數量的版本值(時間戳不同),因此對於需要存儲變動歷史記錄的數據,用HBase將非常方便。

超大數據量:

當數據量越來越大,RDBMS數據庫撐不住了,就出現了讀寫分離策略,通過一個Master專門負責寫操作,多個Slave負責讀操作,服務器成本倍增。隨著壓力增加,Master撐不住了,這時就要分庫了,把關聯不大的數據分開部署,一些join查詢不能用了,需要借助中間層。隨著數據量的進一步增加,一個表的記錄越來越大,查詢就變得很慢,於是又得搞分表,比如按ID取模分成多個表以減少單個表的記錄數。經歷過這些事的人都知道過程是多麽的折騰。采用HBase就簡單了,只需要在集群中加入新的節點即可,HBase會自動水平切分擴展,跟Hadoop的無縫集成保障了數據的可靠性(HDFS)和海量數據分析的高性能(MapReduce)。

6 、HBase的MapReduce

技術分享圖片

HBase中Table和Region的關系,有些類似HDFS中File和Block的關系。由於HBase提供了配套的與MapReduce進行交互的API如TableInputFormat和TableOutputFormat,可以將HBase的數據表直接作為Hadoop MapReduce的輸入和輸出,從而方便了MapReduce應用程序的開發,基本不需要關註HBase系統自身的處理細節。

HBase原理介紹