系统架构

在文章【HBase】基本介绍和基础架构中已经有简单介绍

【HBase】底层原理-LMLPHP

Client —— 包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如region的位置信息。

Zookeeper:

1.保证任何时候,集群中只有一个master

2.存贮所有Region的寻址入口----root表在哪台服务器上。

3.实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master

4.存储Hbase的schema,包括有哪些table,每个table有哪些column family

Master:

1.为Region server分配region

2.负责region server的负载均衡

3.发现失效的region server并重新分配其上的region

4.HDFS上的垃圾文件回收

5.处理schema更新请求

Region Server:

1.Region server维护Master分配给它的region,处理对这些region的IO请求

2.Region server负责切分在运行过程中变得过大的region



client访问HBase数据的过程中并不需要HMaster的参与,是直接通过ZooKeeper读取HRegionServer中Meta表存放的HRegion位置


表数据模型

基本介绍在【HBase】表模型和基本操作介绍

注意:

1.列族的访问控制、磁盘和内存的使用统计都是在列族层面进行,一般一张表不要设置太多列族,因为列族越多,读取一行数据时所要参与IO、搜寻的文件就越多

2.每条数据默认3个版本号


物理存储

【HBase】底层原理-LMLPHP

1.Table中所有行都按照rowKey的字典顺序排列,并且在行的方向上分割为多个HRegion

2.HRegion是HBase中分布式存储和负载均衡的最小单元,不同的HRegion可以分布在不同的HRegionServer上,但同一个HRegion不会拆分到不同的HRegionServer

3.HRegion由多个Store组成,每个Store保存一个列族(Column Family)

4.HFile是一种文件存储格式,类似于ORC、Parquet



meta表的数据信息

ROW                              COLUMN+CELL

 hbase:namespace,,1557280798528. column=info:regioninfo, timestamp=1557280800325, value={ENCODED => 56c88e849283c869e74095d5
56c88e849283c869e74095d5bf616b4 bf616b49, NAME => 'hbase:namespace,,1557280798528.56c88e849283c869e74095d5bf616b49.', START
9. KEY => '', ENDKEY => ''}
hbase:namespace,,1557280798528. column=info:seqnumDuringOpen, timestamp=1557280800325, value=\x00\x00\x00\x00\x00\x00\x00\x
56c88e849283c869e74095d5bf616b4 02
9.
hbase:namespace,,1557280798528. column=info:server, timestamp=1557280800325, value=node02.hadoop.com:60020
56c88e849283c869e74095d5bf616b4
9.
hbase:namespace,,1557280798528. column=info:serverstartcode, timestamp=1557280800325, value=1557280788349
56c88e849283c869e74095d5bf616b4
9.
myuser,,1557285598626.9a6ee8080 column=info:regioninfo, timestamp=1557285599647, value={ENCODED => 9a6ee8080ee16457bb791a10
ee16457bb791a10cca6c498. cca6c498, NAME => 'myuser,,1557285598626.9a6ee8080ee16457bb791a10cca6c498.', STARTKEY => ''
, ENDKEY => ''}
myuser,,1557285598626.9a6ee8080 column=info:seqnumDuringOpen, timestamp=1557285599647, value=\x00\x00\x00\x00\x00\x00\x00\x
ee16457bb791a10cca6c498. 02
myuser,,1557285598626.9a6ee8080 column=info:server, timestamp=1557285599647, value=node02.hadoop.com:60020
ee16457bb791a10cca6c498.
myuser,,1557285598626.9a6ee8080 column=info:serverstartcode, timestamp=1557285599647, value=1557280788349
ee16457bb791a10cca6c498.
user,,1557283951792.5b54e4569a9 column=info:regioninfo, timestamp=1557284223555, value={ENCODED => 5b54e4569a9e7f541340077f
e7f541340077ff35c168f. f35c168f, NAME => 'user,,1557283951792.5b54e4569a9e7f541340077ff35c168f.', STARTKEY => '',
ENDKEY => ''}
user,,1557283951792.5b54e4569a9 column=info:seqnumDuringOpen, timestamp=1557284223555, value=\x00\x00\x00\x00\x00\x00\x00\x
e7f541340077ff35c168f. 05
user,,1557283951792.5b54e4569a9 column=info:server, timestamp=1557284223555, value=node01.hadoop.com:60020
e7f541340077ff35c168f.
user,,1557283951792.5b54e4569a9 column=info:serverstartcode, timestamp=1557284223555, value=1557280783177
e7f541340077ff35c168f.
3 row(s) in 0.0500 seconds
05-28 08:01