【大数据学习 | HBASE】hbase的写数据流程与hbase插入数据
1. 写数据流程
在讲hbase的数据读写流程之前,我们先要进行普及一个事情就是zookeeper在hbase中的作用,zookeeper在整个hbase的集群中是一个协调者的身份存在的,能够协调多个hmaster实现主从的选举,维护整个集群的稳定性和高可靠性,除此之外zookeeper还用于记录hbase的元数据信息的情况.
我们知道hbase的一个表为了多个机器并行进行管理和查询,将数据按照行进行拆分为多个region部分,多个region的数据会分散到不同的regionserver中进行管理,每个region会记录着所存储数据的startkey和endkey,那么我们在查询hbase的一条数据的时候就要知道去那个region中查询,并且知道这个region在什么位置,这个数据会被系统自动记录到hbase:meta的表中。
hbase:002:0> list_namespace_tables 'hbase'
TABLE
meta
namespace
2 row(s)
Took 0.0269 seconds
这个表全部都是元数据信息,但是这个表也会存在很多region信息,我们应该去那个region中查询meta表的数据呢,这个时候meta表也需要自己的一个元数据表进行记录,这个表会放入到zookeeper中进行存储。
在zookeeper中会存在meta-region-server的一个数据信息
我们看一下meta表的数据信息:
# 进入hbase
hbase shell
# 查看表的数据
scan 'hbase:meta'
hbase:004:0> scan 'hbase:meta'
ROW COLUMN+CELL hainiu:info column=table:state, timestamp=2024-11-09T20:51:53.977, value=\x08\x00 hainiu:info,,1731156712639. column=info:regioninfo, timestamp=2024-11-09T21:28:43.576, value={ENCODED => 06af006af07598fc46cd7660410914d5 7598fc46cd7660410914d5ead53, NAME => 'hainiu:info,,1731156712639.06af07598fc46cd76ead53. 60410914d5ead53.', STARTKEY => '', ENDKEY => ''} hainiu:info,,1731156712639. column=info:seqnumDuringOpen, timestamp=2024-11-09T21:28:43.576, value=\x00\x00\x006af07598fc46cd7660410914d5 0\x00\x00\x00\x00\x05 ead53. hainiu:info,,1731156712639. column=info:server, timestamp=2024-11-09T21:28:43.576, value=hadoop107:16020 06af07598fc46cd7660410914d5 ead53.
这个就是元数据的内容信息,其中内容如下:
hainiu:info,,1731156712639. column=info:server, timestamp=2024-11-09T21:28:43.576, value=hadoop107:16020 06af07598fc46cd7660410914d5
meta表中的一个Rowkey就代表了一个region Rowkey主要由以下几部分组成:
TableName(业务表名)
StartRow(业务表Region区间的起始rowkey)
Timestamp(Region创建的时间戳)
EncodedName(上面3个字段的MD5 Hex值)4个字段拼接而成 也就是regionId
Rowkey:search_table,,1625037955174.f507364ab62a42cfe702c6b3dea8757c.
TableName: search_table为表名称。
StartRow: StartRow缺失 Timestamp: 1625037955174
EncodedName: 1625037955174.f507364ab62a42cfe702c6b3dea8757c.
各个列的信息
info:regioninfo
value主要存储4个信息,即EncodedName、RegionName、Region的StartRow、Region的StopRow
hbase:namespace,,1730988821 column=info:regioninfo, timestamp=2024-11-07T22:23:19.809, value={ENCODED => 43ca4386.43ca43ede2a1a6719142522 3ede2a1a67191425229f3f37d0c, NAME => 'hbase:namespace,,1730988821386.43ca43ede2a1a9f3f37d0c. 67191425229f3f37d0c.', STARTKEY => '', ENDKEY => ''}
info:server
不同的region位于哪个regionserver上面
column=info:server, timestamp=2024-11-07T22:23:19.809
我们还需要知道一个文件WAL
同hdfs的edits日志文件一样,每个regionserver中都存在一个HLog文件,这个文件主要是hbase的操作日志文件,这个文件内的数据会记录的操作,防止集群损坏后恢复用的
文件在这个目录下 /hbase/WALs/
# 我们可以使用hbase的命令进行操作查看文件中的内容
hbase wal <hfile文件路径> -j 以json形式输出
流程如下:
- 首先访问zookeeper获取meta表的信息
- 按照meta的信息去往相应的regionserver中查询对应的数据
- 返回数据后放入到自己的客户端缓存中进行保存,防止下次查询还需要继续检索
- 发送存储请求到regionserver
- 将发送请求的信息放入到WAL的预写日志中
- 然后将数据存储到memstore中进行缓存,并且按照key进行排序,保证数据是一个树状结构
- 然后返回客户端写完毕确认
- 一旦达成memstore的写出条件会写出内存中的数据到hdfs中
2. hbase插入数据
添加数据
# 创建连接
hbase shell
# 插入数据
put <table> <rowkey> <columnFamily:column> <value>
# 插入数据要按照rowkey指定不同的列进行插入
hbase:009:0> put 'hainiu:info','002','info1:name','hexuan1'
Took 0.0208 seconds
hbase:010:0> put 'hainiu:info','001','info1:name','hexuan0'
Took 0.0128 seconds
hbase:011:0> put 'hainiu:info','003','info1:name','hexuan2'
Took 0.0116 seconds
# 因为hbase是以列族为主的,那么存储的数据在不同的行是可以存在不同列的
# scan是扫描的方法,可以直接查看所有的表的数据
hbase:012:0> scan 'hainiu:info'
ROW COLUMN+CELL 001 column=info1:name, timestamp=2024-11-10T23:20:11.473, value=hexuan0 002 column=info1:name, timestamp=2024-11-10T23:20:04.328, value=hexuan1 003 column=info1:name, timestamp=2024-11-10T23:20:23.347, value=hexuan2
3 row(s)
Took 0.0211 seconds
数据在插入的时候会显示当时插入的时间戳信息,并且在hbase中不存在修改操作,只有put,如果数据重复就会覆盖更新值。
hbase 删除数据
# delete 删除一个值
delete <table><rowkey><columnFamily:column>
# delete all 删除一整行
deleteall <table><rowkey># truncate 可以直接清空表的全部数据
#直接删除表,并且重建表,速度特别快
truncate 'hainiu:info'
hbase:001:0> scan 'hainiu:info'
ROW COLUMN+CELL 001 column=info1:name, timestamp=2024-11-10T23:20:11.473, value=hexuan0 002 column=info1:name, timestamp=2024-11-10T23:20:04.328, value=hexuan1 003 column=info1:name, timestamp=2024-11-10T23:20:23.347, value=hexuan2
3 row(s)
Took 5.7214 seconds
hbase:002:0> delete 'hainiu:info','003','info1:name'
Took 0.1900 seconds
hbase:003:0> scan 'hainiu:info'
ROW COLUMN+CELL 001 column=info1:name, timestamp=2024-11-10T23:20:11.473, value=hexuan0 002 column=info1:name, timestamp=2024-11-10T23:20:04.328, value=hexuan1
2 row(s)
Took 0.0273 seconds