【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据

1. hbase的读数据流程

在解析读取流程之前我们还需要知道两个功能性的组件和HFIle的格式信息

HFILE

存储在hdfs中的hbase文件,这个文件中会存在hbase中的数据以kv类型显示,同时还会存在hbase的元数据信息 ,包括整个hfile文件的索引大小,描述,k和v的均匀长度,文件中包含的开始的key和结束的key ,以及中位数key,等信息便于检索 ,以及布隆过滤器 等信息,这个数据在我们hbase进行查询读取的时候按照64KB为一个大小进行读取内容数据,其中读取的元数据会全部加载 ,但是kv类型的真正存储数据会按照64KB为最小单位读取进来

java 复制代码
# flush表的数据,清空memstore
flush <table>
# 查看命令为
hbase hfile -m -b -p -f <hfile的文件路径>
-m 打印元数据信息
-b 打印块信息
-p 打印数据内容
-f 后面接文件

例子:hfile的文件路径:

查看某一列的数据信息:

布隆过滤器:

一个使用hash表 作为计算规则的过滤器 ,也就是在写入数据到hbase的时候要先将数据写出到memstore中 ,在memstore写满了以后就会将数据以storeFile形式写出到磁盘上 ,这个时候也会生成一份对应数据的hash表文件以metablock的形式存储到起来 ,它的功能非常实用,比如我们在查询数据的时候就可以首先将这个数据进行hash处理,然后和hash表进行比对,如果不存在可以直接避免扫描这个storeFile文件。在巨大的数据面前可以进行高效的数据。

一句话:查询数据的时候将对其进行哈希处理,然后与哈希地图进行比对,如果哈希表取到的值为空,说明storeFile没有该要查询的数据,如果哈希表找到的值不为空,也不一定存在要查询的数据。

blockCache

对应表数据的regionserver级别的缓存组件,主要使用规则就是在查询数据的时候也会将查询结果缓存到regionserver对应的blockCache组件中下次查询的时候可以直接使用上次查询的结果 ,blockCache中存储的数据内存包含索引文件布隆过滤器的值和数据的key ,其他的value数据,会以64Kb为大小进行存储,如果数据过期了先清理value的数据,而索引等数据和元数据信息不会清理出去。

blockCache是 regionserver级别的缓存组件,我的hbase集群只有两个工作节点,即存在两个regionserver,每个regionserver都存在一个blockCache,所以我desc info表会出现两条记录。

所以hbase的读写数据流程为:

读取数据流程

  • 首先读取zookeeper中的元数据meta表的信息
  • 其次根据meta表的信息找寻相应的region获取元数据信息
  • 然后将meta表的元数据信息放入到自己的客户端缓存中
  • 根据meta表的信息找寻student表对应的region所在的regionserver
  • 然后根据查询的内容先去memstore文件中找寻数据
  • 如果没有再去blockcache缓存中找寻数据,但是并不是直接将数据返回,而是通过key和索引文件去storeFile中查询比对,不然会出现数据过期问题
  • 都没有再从storeFile和hfile中找寻数据,这个过程会使用到布隆过滤器
  • 然后在将数据存储到blockcache中然后在返回给客户端

2. hbase读取数据

在hainiu命名空间创建student表:

java 复制代码
hbase:007:0> put 'hainiu:student','001','cf1:name','1'
Took 0.0828 seconds                                                                                            
hbase:008:0> put 'hainiu:student','002','cf1:name','2'
Took 0.0173 seconds                                                                                            
hbase:009:0> put 'hainiu:student','001','cf1:age','10'
Took 0.0267 seconds                                                                                            
hbase:010:0> put 'hainiu:student','002','cf1:age','20'
Took 2.0660 seconds                                                                                            
hbase:011:0> scan 'hainiu:student'
ROW                          COLUMN+CELL                                                                       
 001                         column=cf1:age, timestamp=2024-11-11T19:15:07.044, value=10                       
 001                         column=cf1:name, timestamp=2024-11-11T19:14:40.544, value=1                       
 002                         column=cf1:age, timestamp=2024-11-11T19:15:18.621, value=20                       
 002                         column=cf1:name, timestamp=2024-11-11T19:14:54.939, value=2                       
2 row(s)
Took 0.1542 seconds                                                                                            
hbase:012:0> put 'hainiu:student','001','cf2:adress','beijin'
Took 0.0695 seconds                                                                                            
hbase:013:0> put 'hainiu:student','002','cf2:adress','beijin'
Took 0.0147 seconds                                                                                            
hbase:014:0> scan 'hainiu:student'
ROW                          COLUMN+CELL                                                                       
 001                         column=cf1:age, timestamp=2024-11-11T19:15:07.044, value=10                       
 001                         column=cf1:name, timestamp=2024-11-11T19:14:40.544, value=1                       
 001                         column=cf2:adress, timestamp=2024-11-11T19:15:52.033, value=beijin                
 002                         column=cf1:age, timestamp=2024-11-11T19:15:18.621, value=20                       
 002                         column=cf1:name, timestamp=2024-11-11T19:14:54.939, value=2                       
 002                         column=cf2:adress, timestamp=2024-11-11T19:16:03.664, value=beijin                
2 row(s)
Took 0.0241 seconds                                       
java 复制代码
# get 获取一个内容按照rowkey查询数据
get 'hainiu:student','001'
# get 获取对应列族的数据
get 'hainiu:student','001','cf1'
# get 获取对应列的信息
get 'hainiu:student','001','cf1:name'
java 复制代码
hbase:017:0> get 'hainiu:student','001'
COLUMN                       CELL                                                                              
 cf1:age                     timestamp=2024-11-11T19:15:07.044, value=10                                       
 cf1:name                    timestamp=2024-11-11T19:14:40.544, value=1                                        
 cf2:adress                  timestamp=2024-11-11T19:15:52.033, value=beijin                                   
1 row(s)

hbase:019:0> get 'hainiu:student','001','cf1'
COLUMN                       CELL                                                                              
 cf1:age                     timestamp=2024-11-11T19:15:07.044, value=10                                       
 cf1:name                    timestamp=2024-11-11T19:14:40.544, value=1                                        
1 row(s)
Took 0.0321 seconds                                                                                            
hbase:020:0> get 'hainiu:student','001','cf1:name'
COLUMN                       CELL                                                                              
 cf1:name                    timestamp=2024-11-11T19:14:40.544, value=1                                        
1 row(s)
Took 0.0231 seconds    
java 复制代码
# scan扫描表的数据
scan table
# 扫描limit
scan 'hainiu:student', {LIMIT => 2}
# 扫描指定的列族
scan 'hainiu:student',{COLUMNS=>'cf1'}
# 扫描指定的列
scan 'hainiu:student',{COLUMNS=>'cf1:age'}
java 复制代码
hbase:022:0> scan 'hainiu:student',{COLUMN=>'cf1'}
ROW                          COLUMN+CELL                                                                       
 001                         column=cf1:age, timestamp=2024-11-11T19:15:07.044, value=10                       
 001                         column=cf1:name, timestamp=2024-11-11T19:14:40.544, value=1                       
 002                         column=cf1:age, timestamp=2024-11-11T19:15:18.621, value=20                       
 002                         column=cf1:name, timestamp=2024-11-11T19:14:54.939, value=2                       
2 row(s)
Took 0.0588 seconds                                                                                            
hbase:023:0> scan 'hainiu:student',{COLUMN=>'cf1:age'}
ROW                          COLUMN+CELL                                                                       
 001                         column=cf1:age, timestamp=2024-11-11T19:15:07.044, value=10                       
 002                         column=cf1:age, timestamp=2024-11-11T19:15:18.621, value=20                       
2 row(s)
java 复制代码
# 过滤器查询
scan 'hainiu:student', FILTER=>"ValueFilter(=,'binary:20')"
# 指定列等值查询
scan 'hainiu:student',{COLUMNS=>'cf1:age',FILTER=>"ValueFilter(!=,'binary:20')"}
# 范围查询
scan 'hainiu:student', { STARTROW => '001', STOPROW => '003'}
# 分页查询
scan 'hainiu:student', {COLUMNS => 'cf1', LIMIT => 2, STARTROW => '001'}
# 范围查询指定相应的列信息
scan 'hainiu:student', { STARTROW => '001', STOPROW => '002', COLUMN => 'cf1:name'}

在范围查询中,从rowKey的[STARTROW, STOPROW)为范围查询,左闭右开区间,包含STARTROW,但不包含STOPROW。

行数查询

java 复制代码
# 查询表的行数
# 语法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum}
# INTERVAL设置多少行显示一次及对应的rowkey,默认1000;
# CACHE每次去取的缓存区大小,默认是10,调整该参数可提高查询速度
count 'hainiu:student'
# 直接查询完毕返回值
count 'hainiu:student', {INTERVAL => 2,CACHE=>50} 
# 间隔两秒返回一次结果值

每间隔50秒,一次性取50行ky。

大表统计

java 复制代码
# 大表统计的时候不能使用hbase自带的count命令,这样hbase压力太大
# 我们可以通过外置的mr进行计算统计大小
hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'tablename'  

多版本查询

java 复制代码
#修改设置版本,查询时,加上版本就可以查出来版本
alter 'hainiu:student',{ NAME =>'cf1', VERSIONS => 2 }

put 'hainiu:student','id10', 'cf1:name','name10a'
put 'hainiu:student','id10', 'cf1:name','name10aa'
put 'hainiu:student','id10', 'cf1:name','name10aaa'

#此时,可以查询出2个版本的数据
get 'hainiu:student', 'id10', { COLUMN =>'cf1:name',  VERSIONS => 2}
相关推荐
醉陌离3 分钟前
渗透测试学习笔记—shodan(2)
笔记·学习
Moshow郑锴8 分钟前
数据库、数据仓库、数据湖、数据中台、湖仓一体的概念和区别
大数据·数据库·数据仓库·数据湖·湖仓一体
ZZZ_O^O31 分钟前
【动态规划-卡特兰数——96.不同的二叉搜索树】
c++·学习·算法·leetcode·动态规划
冷心笑看丽美人1 小时前
Spring 框架七大模块(Java EE 学习笔记03)
学习·spring·架构·java-ee
huaqianzkh1 小时前
学习C#中的BackgroundWorker 组件
开发语言·学习·c#
今天我又学废了2 小时前
Scala学习记录,Array
学习
今天我又学废了2 小时前
Scala学习记录,字符串
学习
不要影响我叠Q2 小时前
《软件工程-北京大学》 学习笔记
笔记·学习
谁在夜里看海.2 小时前
【从零开始的算法学习日记✨优选算法篇✨】第二章:流动之窗,探索算法的优雅之道
c++·学习·算法