所用的版本:hbase-1.2.0-cdh5.15.1
一.meta表
zookeeper记录了保存meta表的机器是hadoop000:
[zk: localhost:2181(CONNECTED) 4] get /hbase/meta-region-server
�regionserver:60020��!���*�PBUF
hadoop000�������.
cZxid = 0x15000007a4
ctime = Fri Feb 05 15:05:31 CST 2021
mZxid = 0x15000007a4
mtime = Fri Feb 05 15:05:31 CST 2021
pZxid = 0x15000007a4
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 63
numChildren = 0
meta表(4条数据,在逻辑上是一条,表示一个region的信息):
meta表,记录了每个region的startKey和endKey
hbase(main):001:0> scan 'hbase:meta'
ROW COLUMN+CELL
pk_hbase_java_api,,1598776765798.d36985fc0e670 column=info:regioninfo, timestamp=1612508732228, value={ENCODED => d36985fc0e67055dc277728c7fefa73b, NAME => 'pk_hbase_java_api,,1598776765
55dc277728c7fefa73b. 798.d36985fc0e67055dc277728c7fefa73b.', STARTKEY => '', ENDKEY => ''}
pk_hbase_java_api,,1598776765798.d36985fc0e670 column=info:seqnumDuringOpen, timestamp=1612508732228, value=\x00\x00\x00\x00\x00\x00\x00\x13
55dc277728c7fefa73b.
pk_hbase_java_api,,1598776765798.d36985fc0e670 column=info:server, timestamp=1612508732228, value=hadoop000:60020
55dc277728c7fefa73b.
pk_hbase_java_api,,1598776765798.d36985fc0e670 column=info:serverstartcode, timestamp=1612508732228, value=1612508724480
55dc277728c7fefa73b.
meta表的rowkey组成为:表名,region startKey,创建时间.hash值。如果当前region为table的第一个region时(第一个region无start key)时,region startKey=null。
meta表只有一个列簇info,并且包含四列:
1、regioninfo:当前region的startKey与endKey,name等消息
2、seqnumDuringOpen:
3、server:region所在服务器及端口
4、serverstartcode:服务开始的时候的timestamp
二.HBase工作流程
1.读的流程
- client访问hbase时,会根据配置的zookeeper地址,在zookeeper中找到保存meta表的机器。
- 客户端会将该meta表加载到本地并进行缓存,根据namespace、表名、以及rowKey查找数据,确定region信息。
- region会有对应的RegionServer信息,就可以与指定的Server进行通信。
查询时namespace、表名、以及rowKey可以确定meta表中的rowkey,因为meta表中的rowkey中包含region startKey。
2.写的流程
- client从Zookeeper中获取meta表所在节点。
- 客户端会将该meta表加载到本地并进行缓存,根据namespace、表名、以及rowKey查找数据,确定region信息。
- 获取指定regionServer的信息。
- HRegionServer先将操作和数据写入HLog,再将数据写入MemStore,并保持有序。
- 当MemStore的数据量超过阈值时,将数据溢写磁盘,生成一个StoreFile文件。
- 当Store中StoreFile的数量超过阈值时,将若干小StoreFile合并(Compact)为一个大StoreFile。
- 当Region中最大Store的大小超过阈值时,Region分裂(Split),等分成两个子Region。
三.物理存储结构
1.Region中有多个Store,一个Store对应一个列簇,Region对应完整的一段逻辑表。
2.Store包含1个MemStore(内存)和多个StoreFile(HDFS)组成。
HBase配置的数据存放路径:
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop000:8020/hbase</value>
</property>
查看hdfs上的文件:
[hadoop@hadoop000 ~]$ hadoop fs -ls /hbase/data/default/pk_hbase_java_api/d36985fc0e67055dc277728c7fefa73b/info
Found 1 items
-rw-r--r-- 3 hadoop supergroup 1259 2020-08-30 21:10 /hbase/data/default/pk_hbase_java_api/d36985fc0e67055dc277728c7fefa73b/info/030808b5981b4a19ae2d6c4a9372ec12
此目录和上图结构一一对应。
namespace: default
table: pk_hbase_java_api
region: d36985fc0e67055dc277728c7fefa73b
CF: info
HFile: 030808b5981b4a19ae2d6c4a9372ec12
由此可见,HFile文件写入的是一个列簇的数据。
HFile文件的一行为:Row-key,CF,字段名称,value。
当用户按照 Row-key 查询数据的时候,HBase 会遍历两个CF中的HFile,通过相同的 Row-Key 标识,将相关的单元格组织成行返回,这样便有了逻辑上的行数据。
系统自动创建的两张表meta和namespace在名为hbase的namespace下:
[hadoop@hadoop000 ~]$ hadoop fs -ls /hbase/data/hbase
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2020-02-05 16:56 /hbase/data/hbase/meta
drwxr-xr-x - hadoop supergroup 0 2020-02-05 16:56 /hbase/data/hbase/namespace