Hbase是bigtable的開源山寨版本。是建立的hdfs之上滔灶,提供高可靠性普碎、高性能、列存儲录平、可伸縮麻车、實時讀寫的數(shù)據(jù)庫系統(tǒng)缀皱。
它介于nosql和RDBMS之間,僅能通過主鍵(row key)和主鍵的range來檢索數(shù)據(jù)动猬,僅支持單行事務(wù)啤斗。主要用來存儲非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)。
與hadoop一樣赁咙,Hbase目標(biāo)主要依靠橫向擴(kuò)展钮莲,通過不斷增加廉價的商用服務(wù)器,來增加計算和存儲能力彼水。
Hbase中的表一般有這樣的特點:
1 大:一個表可以有上億行崔拥,上百萬列
2 面向列:面向列(族)的存儲和權(quán)限控制,列(族)獨立檢索凤覆。
3 稀疏:對于為空(null)的列链瓦,并不占用存儲空間,因此盯桦,表可以設(shè)計的非常稀疏慈俯。
下面一幅圖是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,實際應(yīng)用中長度一般為 10-100bytes)璃哟,在Hbase內(nèi)部氛琢,row key保存為字節(jié)數(shù)組。
存儲時随闪,數(shù)據(jù)按照Row key的字典序(byte order)排序存儲阳似。設(shè)計key時,要充分排序存儲這個特性铐伴,將經(jīng)常一起讀取的行存儲放到一起撮奏。
注意:
字典序?qū)nt排序的結(jié)果是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表中的每個列户矢,都?xì)w屬與某個列族玲献。列族是表的chema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為前綴捌年。例如courses:history瓢娜,courses:math
都屬于courses 這個列族。
時間戳
Hbase中通過row和columns確定的為一個存貯單元稱為cell礼预。每個 cell都保存著同一份數(shù)據(jù)的多個版本眠砾。版本通過時間戳來索引。時間戳的類型是 64位整型托酸。時間戳可以由Hbase(在數(shù)據(jù)寫入時自動 )賦值褒颈,此時時間戳是精確到毫秒的當(dāng)前系統(tǒng)時間。時間戳也可以由客戶顯式賦值获高。如果應(yī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不斷增大碍扔,當(dāng)增大到一個閥值的時候,Hregion就會等分會兩個新的Hregion秕重。當(dāng)table中的行不斷增多不同,就會有越來越多的Hregion。
4 HRegion是Hbase中分布式存儲和負(fù)載均衡的最小單元溶耘。最小單元就表示不同的Hregion可以分布在不同的HRegion server上二拐。但一個Hregion是不會拆分到多個server上的。
5 HRegion雖然是分布式存儲的最小單元凳兵,但并不是存儲的最小單元百新。
事實上,HRegion由一個或者多個Store組成庐扫,每個store保存一個columns family吟孙。
每個Strore又由一個memStore和0至多個StoreFile組成澜倦。如圖:
StoreFile以HFile格式保存在HDFS上聚蝶。
Hbase基本組件說明:
Client
?包含訪問HBase的接口杰妓,并維護(hù)cache來加快對HBase的訪問,比如region的位置信息
Master
?為Region server分配region
?負(fù)責(zé)Region server的負(fù)載均衡
?發(fā)現(xiàn)失效的Region server并重新分配其上的region
?管理用戶對table的增刪改查操作
Region Server
?Regionserver維護(hù)region碘勉,處理對這些region的IO請求
?Regionserver負(fù)責(zé)切分在運行過程中變得過大的region
Zookeeper作用
?通過選舉巷挥,保證任何時候,集群中只有一個master验靡,Master與RegionServers 啟動時會向ZooKeeper注冊
?存貯所有Region的尋址入口
?實時監(jiān)控Region server的上線和下線信息倍宾。并實時通知給Master
?存儲HBase的schema和table元數(shù)據(jù)
?默認(rèn)情況下,HBase 管理ZooKeeper 實例胜嗓,比如高职, 啟動或者停止ZooKeeper
?Zookeeper的引入使得Master不再是單點故障
Write-Ahead-Log(WAL)HLog
該機(jī)制用于數(shù)據(jù)的容錯和恢復(fù):
每個HRegionServer中都有一個HLog對象,HLog是一個實現(xiàn)Write Ahead Log的類辞州,在每次用戶操作寫入MemStore的同時怔锌,也會寫一份數(shù)據(jù)到HLog文件中(HLog文件格式見后續(xù)),HLog文件定期會滾動出新的变过,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))埃元。當(dāng)HRegionServer意外終止后,HMaster會通過Zookeeper感知到媚狰,HMaster首先會處理遺留的 HLog文件岛杀,將其中不同Region的Log數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng)region的目錄下崭孤,然后再將失效的region重新分配类嗤,領(lǐng)取 到這些region的HRegionServer在Load Region的過程中,會發(fā)現(xiàn)有歷史HLog需要處理辨宠,因此會Replay HLog中的數(shù)據(jù)到MemStore中遗锣,然后flush到StoreFiles,完成數(shù)據(jù)恢復(fù)
HBase容錯性
Master容錯:Zookeeper重新選擇一個新的Master
?無Master過程中彭羹,數(shù)據(jù)讀取仍照常進(jìn)行黄伊;
?無master過程中,region切分派殷、負(fù)載均衡等無法進(jìn)行还最;
RegionServer容錯:定時向Zookeeper匯報心跳,如果一旦時間內(nèi)未出現(xiàn)心跳毡惜,Master將該RegionServer上的Region重新分配到其他RegionServer上拓轻,失效服務(wù)器上“預(yù)寫”日志由主服務(wù)器進(jìn)行分割并派送給新的RegionServer
Zookeeper容錯:Zookeeper是一個可靠地服務(wù),一般配置3或5個Zookeeper實例
Region定位流程:
尋找RegionServer
ZooKeeper--> -ROOT-(單Region)--> .META.--> 用戶表
-ROOT-
?表包含.META.表所在的region列表经伙,該表只會有一個Region扶叉;
?Zookeeper中記錄了-ROOT-表的location勿锅。
.META.
?表包含所有的用戶空間region列表,以及RegionServer的服務(wù)器地址枣氧。
HBase存儲數(shù)據(jù)其底層使用的是HDFS來作為存儲介質(zhì)溢十,HBase的每一張表對應(yīng)的HDFS目錄上的一個文件夾,文件夾名以HBase表進(jìn)行命名(如果沒有使用命名空間达吞,則默認(rèn)在default目錄下)张弛,在表文件夾下存放在若干個Region命名的文件夾,Region文件夾中的每個列簇也是用文件夾進(jìn)行存儲的酪劫,每個列簇中存儲就是實際的數(shù)據(jù)吞鸭,以HFile的形式存在。路徑格式如下:
/hbase/data/default/<tbl_name>/<region_id>/<cf>/<hfile_id>
謝謝