HBase數(shù)據(jù)模型
邏輯上,HBase的數(shù)據(jù)模型同關(guān)系型數(shù)據(jù)庫很類似芍锦,數(shù)據(jù)存儲(chǔ)在一張表中竹勉,有行有列。但從HBase的底層物理存儲(chǔ)結(jié)構(gòu)(K-V)來看娄琉,HBase更像是一個(gè)multi-dimensional map次乓。
- 邏輯結(jié)構(gòu)
-
物理結(jié)構(gòu)
- 相關(guān)概念
- Name Space
命名空間吓歇,類似于關(guān)系型數(shù)據(jù)庫的DatabBase概念,每個(gè)命名空間下有多個(gè)表票腰。HBase有兩個(gè)自帶的命名空間城看,分別是hbase和default,hbase中存放的是HBase內(nèi)置的表杏慰,default表是用戶默認(rèn)使用的命名空間测柠。 - Region
類似于關(guān)系型數(shù)據(jù)庫的表概念。不同的是逃默,HBase定義表時(shí)只需要聲明列族即可鹃愤,不需要聲明具體的列。這意味著完域,往HBase寫入數(shù)據(jù)時(shí),字段可以動(dòng)態(tài)瘩将、按需指定吟税。因此,和關(guān)系型數(shù)據(jù)庫相比姿现,HBase能夠輕松應(yīng)對(duì)字段變更的場(chǎng)景肠仪。 - Row
HBase表中的每行數(shù)據(jù)都由一個(gè)RowKey和多個(gè)Column(列)組成,數(shù)據(jù)是按照RowKey的字典順序存儲(chǔ)的备典,并且查詢數(shù)據(jù)時(shí)只能根據(jù)RowKey進(jìn)行檢索异旧,所以RowKey的設(shè)計(jì)十分重要。 - Column
HBase中的每個(gè)列都由Column Family(列族)和Column Qualifier(列限定符)進(jìn)行限定提佣,例如info:name吮蛹,info:age。建表時(shí)拌屏,只需指明列族潮针,而列限定符無需預(yù)先定義。 - Time Stamp
用于標(biāo)識(shí)數(shù)據(jù)的不同版本(version)倚喂,每條數(shù)據(jù)寫入時(shí)每篷,如果不指定時(shí)間戳,系統(tǒng)會(huì)自動(dòng)為其加上該字段端圈,其值為寫入HBase的時(shí)間焦读。 - Cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一確定的單元。cell中的數(shù)據(jù)是沒有類型的舱权,全部是字節(jié)數(shù)組形式存貯
架構(gòu)原理
- Region Server
Region Server為 Region的管理者矗晃,其實(shí)現(xiàn)類為HRegionServer,主要作用如下:
對(duì)于數(shù)據(jù)的操作:get, put, delete刑巧;
對(duì)于Region的操作:splitRegion喧兄、compactRegion无畔。 - Master
Master是所有Region Server的管理者,其實(shí)現(xiàn)類為HMaster吠冤,主要作用如下:
對(duì)于表的操作:create, delete, alter
對(duì)于RegionServer的操作:分配regions到每個(gè)RegionServer浑彰,監(jiān)控每個(gè)RegionServer的狀態(tài),負(fù)載均衡和故障轉(zhuǎn)移拯辙。 - ZK
HBase通過Zookeeper來做Master的高可用郭变、RegionServer的監(jiān)控、元數(shù)據(jù)的入口以及集群配置的維護(hù)等工作涯保。 - HDFS
HDFS為HBase提供最終的底層數(shù)據(jù)存儲(chǔ)服務(wù)诉濒,同時(shí)為HBase提供高可用的支持 - StoreFile
保存實(shí)際數(shù)據(jù)的物理文件,StoreFile以HFile的形式存儲(chǔ)在HDFS上夕春。每個(gè)Store會(huì)有一個(gè)或多個(gè)StoreFile(HFile)未荒,數(shù)據(jù)在每個(gè)StoreFile中都是有序的。 - MemStore
寫緩存及志,由于HFile中的數(shù)據(jù)要求是有序的疚察,所以數(shù)據(jù)是先存儲(chǔ)在MemStore中凿蒜,排好序后毅哗,等到達(dá)刷寫時(shí)機(jī)才會(huì)刷寫到HFile剪返,每次刷寫都會(huì)形成一個(gè)新的HFile。 - WAL
由于數(shù)據(jù)要經(jīng)MemStore排序后才能刷寫到HFile倚搬,但把數(shù)據(jù)保存在內(nèi)存中會(huì)有很高的概率導(dǎo)致數(shù)據(jù)丟失冶共,為了解決這個(gè)問題,數(shù)據(jù)會(huì)先寫在一個(gè)叫做Write-Ahead logfile(HLog)的文件中每界,然后再寫入MemStore中捅僵。所以在系統(tǒng)出現(xiàn)故障的時(shí)候,數(shù)據(jù)可以通過這個(gè)日志文件重建盆犁。
寫數(shù)據(jù)流程
寫流程:
- Client先訪問zookeeper命咐,獲取hbase:meta表位于哪個(gè)Region Server。
- 訪問對(duì)應(yīng)的Region Server谐岁,獲取hbase:meta表醋奠,根據(jù)讀請(qǐng)求的namespace:table/rowkey,查詢出目標(biāo)數(shù)據(jù)位于哪個(gè)Region Server中的哪個(gè)Region中伊佃。并將該table的region信息以及meta表的位置信息緩存在客戶端的meta cache窜司,方便下次訪問。
- 與目標(biāo)Region Server進(jìn)行通訊航揉;
- 將數(shù)據(jù)順序?qū)懭耄ㄗ芳樱┑絎AL塞祈;
- 將數(shù)據(jù)寫入對(duì)應(yīng)的MemStore,數(shù)據(jù)會(huì)在MemStore進(jìn)行排序帅涂;
- 向客戶端發(fā)送ack议薪;
- 等達(dá)到MemStore的刷寫時(shí)機(jī)后尤蛮,將數(shù)據(jù)刷寫到HFile;
- MemStore Flush
MemStore刷寫時(shí)機(jī):
當(dāng)某個(gè)memstroe的大小達(dá)到了hbase.hregion.memstore.flush.size(默認(rèn)值128M),其所在region的所有memstore都會(huì)刷寫斯议。
當(dāng)memstore的大小達(dá)到了
hbase.hregion.memstore.flush.size(默認(rèn)值128M) *hbase.hregion.memstore.block.multiplier(默認(rèn)值4)時(shí)产捞,會(huì)阻止繼續(xù)往該memstore寫數(shù)據(jù)。-
當(dāng)region server中memstore的總大小達(dá)到
java_heapsize * hbase.regionserver.global.memstore.size(默認(rèn)值0.4) * hbase.regionserver.global.memstore.size.upper.limit(默認(rèn)值0.95)哼御,
region會(huì)按照其所有memstore的大小順序(由大到信髁佟)依次進(jìn)行刷寫。直到region server中所有memstore的總大小減小到hbase.regionserver.global.memstore.size.lower.limit以下恋昼。當(dāng)region server中memstore的總大小達(dá)到
java_heapsize * hbase.regionserver.global.memstore.size(默認(rèn)值0.4)時(shí)看靠,會(huì)阻止繼續(xù)往所有的memstore寫數(shù)據(jù)。 -
到達(dá)自動(dòng)刷寫的時(shí)間液肌,也會(huì)觸發(fā)memstore flush挟炬。
自動(dòng)刷新的時(shí)間間隔由該屬性進(jìn)行配置hbase.regionserver.optionalcacheflushinterval(默認(rèn)1小時(shí))。當(dāng)WAL文件的數(shù)量超過hbase.regionserver.max.logs矩屁,region會(huì)按照時(shí)間順序依次進(jìn)行刷寫辟宗,直到WAL文件數(shù)量減小到hbase.regionserver.max.log以下(該屬性名已經(jīng)廢棄,現(xiàn)無需手動(dòng)設(shè)置吝秕,最大值為32)
讀數(shù)據(jù)流程
讀流程:
- Client先訪問zookeeper,獲取hbase:meta表位于哪個(gè)Region Server空幻。
- 訪問對(duì)應(yīng)的Region Server烁峭,獲取hbase:meta表,根據(jù)讀請(qǐng)求的namespace:table/rowkey秕铛,查詢出目標(biāo)數(shù)據(jù)位于哪個(gè)Region Server中的哪個(gè)Region中约郁。并將該table的region信息以及meta表的位置信息緩存在客戶端的meta cache,方便下次訪問但两。
- 與目標(biāo)Region Server進(jìn)行通訊鬓梅;
- 分別在Block Cache(讀緩存),MemStore和Store File(HFile)中查詢目標(biāo)數(shù)據(jù)谨湘,并將查到的所有數(shù)據(jù)進(jìn)行合并绽快。此處所有數(shù)據(jù)是指同一條數(shù)據(jù)的不同版本(time stamp)或者不同的類型(Put/Delete)。
- 將從文件中查詢到的數(shù)據(jù)塊(Block紧阔,HFile數(shù)據(jù)存儲(chǔ)單元坊罢,默認(rèn)大小為64KB)緩存到Block Cache。
將合并后的最終結(jié)果返回給客戶端