当前位置: 首页 > news >正文

【大数据学习 | 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       


http://www.mrgr.cn/news/70093.html

相关文章:

  • 使用控制台对C语言文件的编译执行
  • 【支付行业-支付系统架构及总结】
  • 【机器学习】K近邻算法
  • 【Python】爬虫通过验证码
  • 项目管理-招标文书都有哪些文件且各自作用
  • Mysql个人八股总结
  • nacos单机服务注册源码解析
  • 第14张 GROUP BY 分组
  • caozha-comment(原生PHP评论系统)
  • 支付宝域名如何加入白名单(扫码老是弹窗)
  • Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
  • 计算机的错误计算(一百五十)
  • 【基于轻量型架构的WEB开发】课程 作业4 AOP
  • CentOS网络配置
  • 第四十一章 Vue之初识VueX
  • 集群架构中Lua脚本的限制以及出现的报错
  • 【王木头】最大似然估计、最大后验估计
  • 23年广大新生赛
  • 由于 C*DN 的不做为,将暂停 C*DN 文章的发表
  • 安全见闻六:通讯协议安全问题剖析
  • DNS域名解析
  • mysql 配置文件 my.cnf 增加 lower_case_table_names = 1 服务启动不了
  • JDBC-Util工具类
  • sql专题 之 三大范式
  • JAVA-顺序表ArrayList(实现ArrayList)
  • 控制台中,为什么会打印出烫烫烫?--那些中文乱码问题【more cpp-8】