hbase是列式數(shù)據(jù)庫,rowkey是字典序的。每個(gè)列族是一個(gè)文件,將經(jīng)常一起查詢的列放到同一個(gè)列族中,減少文件的尋址時(shí)間。
數(shù)據(jù)模型:
rowkey:是Byte?array,是表中每條記錄的“主鍵”,方便快速查找,rowkey的設(shè)計(jì)很重要
column?family:列族,擁有一個(gè)名稱(string),包含一個(gè)或者多個(gè)相關(guān)列
column:屬于一個(gè)column?family,column?name的每條記錄可以動(dòng)態(tài)添加
version?number:類型為Long,默認(rèn)值是系統(tǒng)時(shí)間戳,可由用戶定義
value:Byte?array
rows是包括所有,column families是除rowkey之外的
versions(版本):是指timestamp 版本號(hào)控制保存的時(shí)間戳的條數(shù)。
TTL:(Time To Live ) 生存時(shí)間,指定數(shù)據(jù)包被路由器丟棄之前允許通過的網(wǎng)段數(shù)量。
物理模型:
Hbase一張表由一個(gè)或者多個(gè)region組成,記錄按照rowkey字典排序 。region按照大小分割的,每一個(gè)表一開始只有一個(gè)region,隨著數(shù)據(jù)不斷插入,region不斷增大,當(dāng)增大到某個(gè)閾值的時(shí)候,region會(huì)等分分裂成新的Hregion,當(dāng)table中的行數(shù)越來越多,region也會(huì)越來越多。
表->Htable
按rowkey范圍分的region->Hregion->region servers?
Hregion按列族(column?family)->多個(gè)Hstore
Hstore->memstore->Hflies(均為有序的kv)
Hfiles->HDFS
組件架構(gòu):
client:訪問Hbase的接口,并維護(hù)cache(元數(shù)據(jù)信息)加速region?server的訪問
master:負(fù)載均衡,分配region到region server
region?server:維護(hù)region,負(fù)責(zé)region的IO請(qǐng)求
zookeeper:保證集群只有一個(gè)master;存儲(chǔ)所有region的入口(root)地址;實(shí)時(shí)監(jiān)控region?server的上下線信息,并通知master。
Hbase寫入數(shù)據(jù)過程:client(spark、hive等)通過zookeeper讓master找到相關(guān)Hregion所在的Hregion?server,把數(shù)據(jù)傳輸?shù)皆搒erver,該server會(huì)先WAL入Hlog,然后把數(shù)據(jù)寫入memstore,memstore會(huì)把接受成功信息反饋給client,然后memstore把數(shù)據(jù)寫入緩存storefiles,storefiles下面有大量Hfile,最后通過HDFSclient寫入HDFS。
menstore的大小和HDFS的broker大小一致,默認(rèn)64M。
Hbase的容錯(cuò)
Hbase的容錯(cuò)借助于zookeeper完成,主要方式是http://www.lxweimin.com/p/da6b121deda8。
Hbase會(huì)在zookeeper中存儲(chǔ)以下信息:
-/hbase/root-region-server,? Root region的位置
-/hbase/table/-ROOT-,根元數(shù)據(jù)信息
-/hbase/table/hbase:meta,元數(shù)據(jù)信息
-/hbase/master,當(dāng)選的master
-/hbase/backup-masters,備選master
-/hbase/rs,region server信息
-/hbase/unassigned,未分配的信息
master容錯(cuò):zookeeper重新選一個(gè)master,無master過程中數(shù)據(jù)照常讀取,但是region切分、負(fù)載均衡無法進(jìn)行;
region server容錯(cuò):定時(shí)向zookeeper匯報(bào)心跳,如果一定時(shí)間內(nèi)未出現(xiàn)心跳,master將該regionserver上的region重新分配到其他regionserver上,失效服務(wù)器上“預(yù)寫”日志由主服務(wù)器進(jìn)行分割并派送給新的regionserver
zookeeper容錯(cuò):一般會(huì)配置3-5個(gè)實(shí)例,比較靠譜
WAL(預(yù)寫日志)是Hbase的regionserver在處理數(shù)據(jù)插入和刪除過程中來記錄操作內(nèi)容的一種日志,在每次put、delete等一條記錄時(shí),會(huì)先寫入到regionserver對(duì)應(yīng)的Hlog文件的過程。
Hbase的compaction和split
隨著寫入不斷增加,flush次數(shù)不斷增多,Hfile文件越來越多,所以Hbase需要對(duì)這些文件進(jìn)行合并。compaction會(huì)從一個(gè)region的一個(gè)store中選擇一些Hfile文件進(jìn)行合并。合并的原理很簡單,先從這些待合并的數(shù)據(jù)文件中讀出keyvalues,再按照由小到大排列后寫入一個(gè)新的文件中。這個(gè)新文件會(huì)取代原先未合并的所有文件并提供服務(wù)。
minor compaction是指選取一些小的、相鄰的storefile將它們合并為一個(gè)更大的storefile,在這個(gè)過程不會(huì)處理已經(jīng)deleted和expired的cell,一次minor compaction的結(jié)果是更少的并且更大的storefile。
major compaction是指將所有的storefile合并成一個(gè)storefile,這個(gè)過程會(huì)清理三類無意義的數(shù)據(jù):被刪除的數(shù)據(jù)、TTL過期數(shù)據(jù)、版本號(hào)超過設(shè)定的數(shù)據(jù)。major compaction持續(xù)時(shí)間比較長,整個(gè)過程會(huì)消耗大量的系統(tǒng)資源,對(duì)上層業(yè)務(wù)有比較大的影響,因此線上業(yè)務(wù)會(huì)關(guān)閉自動(dòng)觸發(fā)major compaction功能,改為手動(dòng)在業(yè)務(wù)低峰期觸發(fā)。
compaction的本質(zhì)是使用短時(shí)間的IO消耗以及帶寬消耗換取后續(xù)查詢的低延遲。compact的速度跟不上Hfile生成的速度,這樣會(huì)使Hfile的數(shù)量越來越多,導(dǎo)致讀取性能降低,為避免這種情況,在Hfile的數(shù)量過多的時(shí)候會(huì)限制寫請(qǐng)求的速度。
split:當(dāng)一個(gè)region太大時(shí),將其分裂成多個(gè)region。
major compaction和split可以手動(dòng)做