Hbase讀寫流程解析(總括)
上節(jié)課我們詳細(xì)說明了Hbase的架構(gòu)螟炫,包括HMaster,HRegionServerf(RS),Hlog,HRegion,Store及HFile各自的作用曙旭,本節(jié)詳細(xì)解析hbase的讀寫流程迷守。
讀數(shù)據(jù)
客戶端在讀取數(shù)據(jù)時,比如我們在Hbase shell下面執(zhí)行:
get 'stable',' rowkey'
或者我們執(zhí)行Java Hbase API去查詢(其實上面的命令行窗口也是轉(zhuǎn)化API接口去查詢的)
通常我們會在網(wǎng)上或者博客上看到贱枣,Hbase是強(qiáng)依賴Zookeeper的,ZK保存著Hbase的元數(shù)據(jù)。
- 那么第一步我們查詢數(shù)據(jù)時捌议,提交請求,Client會去ZK里查找Meta表的元數(shù)據(jù)(舊版本實際上還有一個-ROOT-表)引有,ZK里到底保存了Meta的哪些信息呢瓣颅,我們可以看下:
[zk: localhost:2181(CONNECTED) 6] get /hbase/meta-region-server
??regionserver:16201dH1??Q?PBUF
??yang05??~??????-???
實際上我們可以看到,里面就是保存了Meta表的一個location,說明Meta表是在哪個RS里保存著呢譬正,這樣Client就可以得到Meta表所在的RS地址
- Client通過ZK得到Meta的位置所在的RS宫补,那么就去請求這臺RS,訪問Meta表的內(nèi)容,如下:
hbase(main):005:0> scan 'hbase:meta'
ROW COLUMN+CELL
bigdata:student,,15529 column=info:regioninfo, timestamp=1552929136826, value={ENCODED
29135868.6b4b97fd206e5 => 6b4b97fd206e5d78aac5bb30e6a0cc7a, NAME => 'bigdata:student,,1
d78aac5bb30e6a0cc7a. 552929135868.6b4b97fd206e5d78aac5bb30e6a0cc7a.', STARTKEY => '',
ENDKEY => ''}
bigdata:student,,15529 column=info:seqnumDuringOpen, timestamp=1552929136826, value=\x0
29135868.6b4b97fd206e5 0\x00\x00\x00\x00\x00\x00\x02
d78aac5bb30e6a0cc7a.
bigdata:student,,15529 column=info:server, timestamp=1552929136826, value=yang05:16201
29135868.6b4b97fd206e5
d78aac5bb30e6a0cc7a.
bigdata:student,,15529 column=info:serverstartcode, timestamp=1552929136826, value=1552
29135868.6b4b97fd206e5 878081913
顯示上面內(nèi)容就是記錄了我們自己業(yè)務(wù)表的信息(元數(shù)據(jù))曾我,其實通過上面的數(shù)據(jù)粉怕,我們知道,Meta表的每一條記錄您单,都記錄了業(yè)務(wù)表的一個region的數(shù)據(jù)斋荞,如上面的STARTKEY ,ENDKEY就是rowkey的范圍
- 知道了數(shù)據(jù)的元數(shù)據(jù),即知道數(shù)據(jù)是在哪個RS中的哪個region里虐秦,客戶端就可以再次請求相應(yīng)的RS平酿。
這里讀請求也是非常復(fù)雜的凤优,我們這里只是簡單說明,后面文章會對這塊詳細(xì)解析蜈彼,Client先在MemStore里找數(shù)據(jù)筑辨,如果MemStore沒有找到數(shù)據(jù),接著會在對應(yīng)的BlockCache里找幸逆,這里也就是Hbase所謂的二級緩沖棍辕,如果還是沒有找到數(shù)據(jù),那么就去Hdfs的上HFile里找數(shù)據(jù)了还绘。
接著從總括上說下Hbase的寫流程...