详解hbase的寻址过程(0.96版本以后,2.0版本以前)
客户端发送查询命令
scan 'user', {COLUMNS => 'base_info', STARTROW => 'rk1', ENDROW => 'rk3'}
寻址过程
1. 客户端请求zk,获取meta表所在位置
2. zk返回节点位置(假设在hadoop01节点)
3. 客户端访问hadoop01节点上的meta表
meta表存放的就是region的元数据信息。meta表格式如下:
ROW COLUMN+CELL
user,,1577522582939.b84a96d0e074272569b6fa79946e79df. column=info:regioninfo, timestamp=1577522584346, value={ENCODED => b84a96d0e074272569b6fa79946e79df, NAME => 'user,,1577522582939.b84a96d0e074272569b6fa79946e79df.', STARTKEY => '', ENDKEY => ''}
user,,1577522582939.b84a96d0e074272569b6fa79946e79df. column=info:seqnumDuringOpen, timestamp=1583992456271, value=\x00\x00\x00\x00\x00\x00\x00[
user,,1577522582939.b84a96d0e074272569b6fa79946e79df. column=info:server, timestamp=1583992456271, value=hadoop01:16020
user,,1577522582939.b84a96d0e074272569b6fa79946e79df. column=info:serverstartcode, timestamp=1583992456271, value=1583992398626
ROW
hbase:meta表的一个rowkey就对应该表的一个region
hbase:meta 表的 rowkey 结构如下:
TableName,StartKey,Timestamp.EncodedName.
- TableName:表名称
- StartKey:表示当前 table 的 region 中存储的第一个 rowkey。如果这个地方为空的话,表明这是 table 的第一个 region。并且如果一个 region 中 StartKey 和 EndKey 都为空的话,表明这个 table 只有一个 region;比如上面的user表就只有一个region( STARTKEY => '', ENDKEY => '')。
- Timestamp:region 创建的时间戳
- EncodedName:TableName,StartKey,Timestamp字符串的MD5 Hex值。
COLUMN+CELL
每一行数据又分为4列,分别是info:regioninfo、info:seqnumDuringOpen、info:server、info:serverstartcode。
info:regioninfo:该列对应的 Value 主要存储4个信息,即EncodedName、RegionName、Region的StartRow、Region的EndRow。
info:seqnumDuringOpen:该列对应的 Value 主要存储Region打开时的sequenceId。
info:server:该列对应的 Value 主要存储Region落在哪个RegionServer上。
info:serverstartcode:该列对应的 Value 主要存储所在RegionServer的启动Timestamp。
因此,通过meta表,客户端就知道所要查询的数据放在哪个RegionServer上的哪个region。本例子返回的就是RegionServer1中的region1。