Hbase读写流程解析(总括)
上节课我们详细说明了Hbase的架构,包括HMaster,HRegionServerf(RS),Hlog,HRegion,Store及HFile各自的作用,本节详细解析hbase的读写流程。
读数据
客户端在读取数据时,比如我们在Hbase shell下面执行:
get 'stable',' rowkey'
或者我们执行Java Hbase API去查询(其实上面的命令行窗口也是转化API接口去查询的)
通常我们会在网上或者博客上看到,Hbase是强依赖Zookeeper的,ZK保存着Hbase的元数据。
- 那么第一步我们查询数据时,提交请求,Client会去ZK里查找Meta表的元数据(旧版本实际上还有一个-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表的内容,如下:
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
显示上面内容就是记录了我们自己业务表的信息(元数据),其实通过上面的数据,我们知道,Meta表的每一条记录,都记录了业务表的一个region的数据,如上面的STARTKEY ,ENDKEY就是rowkey的范围
- 知道了数据的元数据,即知道数据是在哪个RS中的哪个region里,客户端就可以再次请求相应的RS。
这里读请求也是非常复杂的,我们这里只是简单说明,后面文章会对这块详细解析,Client先在MemStore里找数据,如果MemStore没有找到数据,接着会在对应的BlockCache里找,这里也就是Hbase所谓的二级缓冲,如果还是没有找到数据,那么就去Hdfs的上HFile里找数据了。
接着从总括上说下Hbase的写流程...