Hbase是bigtable的開源山寨版本。是建立的hdfs之上,提供高可靠性、高性能、列存儲、可伸縮、實時讀寫的數(shù)據(jù)庫系統(tǒng)。
它介于nosql和RDBMS之間,僅能通過主鍵(row key)和主鍵的range來檢索數(shù)據(jù),僅支持單行事務。主要用來存儲非結構化和半結構化的松散數(shù)據(jù)。
與hadoop一樣,Hbase目標主要依靠橫向擴展,通過不斷增加廉價的商用服務器,來增加計算和存儲能力。
Hbase中的表一般有這樣的特點:
1 大:一個表可以有上億行,上百萬列
2 面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索。
3 稀疏:對于為空(null)的列,并不占用存儲空間,因此,表可以設計的非常稀疏。
下面一幅圖是Hbase在Hadoop Ecosystem中的位置。

二、邏輯視圖
Hbase以表的形式存儲數(shù)據(jù)。表有行和列組成。列劃分為若干個列族(row family)

Row Key
與nosql數(shù)據(jù)庫們一樣,row key是用來檢索記錄的主鍵。訪問Hbase table中的行,只有三種方式:
1 通過單個row key訪問
2 通過row key的range
3 全表掃描
Row key行鍵 (Row key)可以是任意字符串(最大長度是 64KB,實際應用中長度一般為 10-100bytes),在Hbase內(nèi)部,row key保存為字節(jié)數(shù)組。
存儲時,數(shù)據(jù)按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將經(jīng)常一起讀取的行存儲放到一起。
注意:
字典序?qū)nt排序的結果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行鍵必須用0作左填充。
行的一次讀寫是原子操作 (不論一次讀寫多少列)。
列族
Hbase表中的每個列,都歸屬與某個列族。列族是表的chema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為前綴。例如courses:history,courses:math
都屬于courses 這個列族。
時間戳
Hbase中通過row和columns確定的為一個存貯單元稱為cell。每個 cell都保存著同一份數(shù)據(jù)的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由Hbase(在數(shù)據(jù)寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統(tǒng)時間。時間戳也可以由客戶顯式賦值。如果應用程序要避免數(shù)據(jù)版本沖突,就必須自己生成具有唯一性的時間戳。每個 cell中,不同版本的數(shù)據(jù)按照時間倒序排序,即最新的數(shù)據(jù)排在最前面。
Cell
由{row key, column, version} 唯一確定的單元。cell中的數(shù)據(jù)是沒有類型的,全部是字節(jié)碼形式存貯。
三、物理存儲
1 已經(jīng)提到過,Table中的所有行都按照row key的字典序排列。
2 Table 在行的方向上分割為多個Hregion。

3 region按大小分割的,每個表一開始只有一個region,隨著數(shù)據(jù)不斷插入表,region不斷增大,當增大到一個閥值的時候,Hregion就會等分會兩個新的Hregion。當table中的行不斷增多,就會有越來越多的Hregion。

4 HRegion是Hbase中分布式存儲和負載均衡的最小單元。最小單元就表示不同的Hregion可以分布在不同的HRegion server上。但一個Hregion是不會拆分到多個server上的。


5 HRegion雖然是分布式存儲的最小單元,但并不是存儲的最小單元。
事實上,HRegion由一個或者多個Store組成,每個store保存一個columns family。
每個Strore又由一個memStore和0至多個StoreFile組成。如圖:
StoreFile以HFile格式保存在HDFS上。

Hbase基本組件說明:
Client
?包含訪問HBase的接口,并維護cache來加快對HBase的訪問,比如region的位置信息
Master
?為Region server分配region
?負責Region server的負載均衡
?發(fā)現(xiàn)失效的Region server并重新分配其上的region
?管理用戶對table的增刪改查操作
Region Server
?Regionserver維護region,處理對這些region的IO請求
?Regionserver負責切分在運行過程中變得過大的region
Zookeeper作用
?通過選舉,保證任何時候,集群中只有一個master,Master與RegionServers 啟動時會向ZooKeeper注冊
?存貯所有Region的尋址入口
?實時監(jiān)控Region server的上線和下線信息。并實時通知給Master
?存儲HBase的schema和table元數(shù)據(jù)
?默認情況下,HBase 管理ZooKeeper 實例,比如, 啟動或者停止ZooKeeper
?Zookeeper的引入使得Master不再是單點故障

Write-Ahead-Log(WAL)HLog

該機制用于數(shù)據(jù)的容錯和恢復:
每個HRegionServer中都有一個HLog對象,HLog是一個實現(xiàn)Write Ahead Log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數(shù)據(jù)到HLog文件中(HLog文件格式見后續(xù)),HLog文件定期會滾動出新的,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))。當HRegionServer意外終止后,HMaster會通過Zookeeper感知到,HMaster首先會處理遺留的 HLog文件,將其中不同Region的Log數(shù)據(jù)進行拆分,分別放到相應region的目錄下,然后再將失效的region重新分配,領取 到這些region的HRegionServer在Load Region的過程中,會發(fā)現(xiàn)有歷史HLog需要處理,因此會Replay HLog中的數(shù)據(jù)到MemStore中,然后flush到StoreFiles,完成數(shù)據(jù)恢復
HBase容錯性
Master容錯:Zookeeper重新選擇一個新的Master
?無Master過程中,數(shù)據(jù)讀取仍照常進行;
?無master過程中,region切分、負載均衡等無法進行;
RegionServer容錯:定時向Zookeeper匯報心跳,如果一旦時間內(nèi)未出現(xiàn)心跳,Master將該RegionServer上的Region重新分配到其他RegionServer上,失效服務器上“預寫”日志由主服務器進行分割并派送給新的RegionServer
Zookeeper容錯:Zookeeper是一個可靠地服務,一般配置3或5個Zookeeper實例
Region定位流程:

尋找RegionServer
ZooKeeper--> -ROOT-(單Region)--> .META.--> 用戶表
-ROOT-
?表包含.META.表所在的region列表,該表只會有一個Region;
?Zookeeper中記錄了-ROOT-表的location。
.META.
?表包含所有的用戶空間region列表,以及RegionServer的服務器地址。
HBase存儲數(shù)據(jù)其底層使用的是HDFS來作為存儲介質(zhì),HBase的每一張表對應的HDFS目錄上的一個文件夾,文件夾名以HBase表進行命名(如果沒有使用命名空間,則默認在default目錄下),在表文件夾下存放在若干個Region命名的文件夾,Region文件夾中的每個列簇也是用文件夾進行存儲的,每個列簇中存儲就是實際的數(shù)據(jù),以HFile的形式存在。路徑格式如下:
/hbase/data/default/<tbl_name>/<region_id>/<cf>/<hfile_id>
謝謝