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

1. hbase的读数据流程

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

HFILE

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

# 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表:

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                                       
# get 获取一个内容按照rowkey查询数据
get 'hainiu:student','001'
# get 获取对应列族的数据
get 'hainiu:student','001','cf1'
# get 获取对应列的信息
get 'hainiu:student','001','cf1:name'
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    
# scan扫描表的数据
scan table
# 扫描limit
scan 'hainiu:student', {LIMIT => 2}
# 扫描指定的列族
scan 'hainiu:student',{COLUMNS=>'cf1'}
# 扫描指定的列
scan 'hainiu:student',{COLUMNS=>'cf1:age'}
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)
# 过滤器查询
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。

行数查询

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

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

大表统计

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

多版本查询

#修改设置版本,查询时,加上版本就可以查出来版本
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}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 nsenter 进入 Docker 容器的操作

在容器化环境下&#xff0c;docker exec 通常是进入容器内部进行调试的常用方式&#xff0c;但在某些情况下&#xff0c;比如 Docker 容器管理工具出现问题&#xff0c;或者我们需要通过进程的命名空间来直接访问容器&#xff0c;nsenter 就成了一个非常有效的工具。本文将介绍…

什么是聚类分析,它在数据分析中的应用是什么

聚类分析是一种无监督学习方法&#xff0c;它旨在将数据集中的样本按照某种相似性准则自动进行分组。聚类分析的目标是将相似的样本划分为同一个簇&#xff0c;同时将不同簇之间的样本尽可能分离开。聚类分析的结果通常用簇的标签来表示&#xff0c;簇标签表示样本所属的簇。 …

MySQL 忘记 root 密码,使用跳过密码验证进行登录

MySQL 忘记 root 密码&#xff0c;使用跳过密码验证进行登录 修改 /etc/my.cnf 配置文件&#xff0c;在 [mysqld] 后面任意一行添加 skip-grant-tables vim /etc/my.cnf 重启 MySQL systemctl restart mysqld 登录 MySQL&#xff08;无 -p 选项&#xff0c;无需密码登录&…

[Linux]IO多路转接(上)

1. IO 多路转接之select 1.1 select概述 select 是系统提供的一个多路转接接口&#xff0c;其核心工作在于等待。它能够让程序同时监视多个文件描述符上的事件是否就绪&#xff0c;只有当被监视的多个文件描述符中有一个或多个事件就绪时&#xff0c;select 才会成功返回&…

推荐一款电脑清理和加速工具:Wise Care 365 Pro

Wise Care 365 Pro是一款可以清理注册表和磁盘垃圾文件&#xff0c;保护个人隐私记录&#xff0c;提高电脑使用安全的软件&#xff0c;是优化系统、提高Windows系统运行速度最好的选择!实时保护注册表不被其他程序未经许可地秘密修改。例如阻止程序更改您的浏览器主页&#xff…

代码随想录算法训练营第四十四天|Day44 动态规划

1143.最长公共子序列 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ye4y1L7CQ https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 #define max(a, b) ((a) > (b) ? (a) : (b)) int longestCommonSu…

Hook小程序

下载&#xff1a; https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python 配置&#xff1a; pip install -r requirements 实现&#xff1a; 开启小程序开发者模式&#xff0c;类似浏览器F12 效果&#xff1a; 使用&#xff1a; 退出微信&#xff0c;进入安装的目录…

HTTP TCP三次握手深入解析

HTTP TCP三次握手深入解析 为了更深入地解析 HTTP 协议中的 TCP 三次握手过程&#xff0c;我们需要从网络通信的基本原理出发&#xff0c;探讨 TCP 协议如何确保可靠的数据传输。TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议…

Mysql 8迁移到达梦DM8遇到的报错

在实战迁移时&#xff0c;遇到两个报错。 一、列[tag]长度超出定义 在mysql中&#xff0c;tag字段的长度是varchar(20)&#xff0c;在迁移到DM8后&#xff0c;这个长度不够用了。怎么解决&#xff1f; 在迁移过程中&#xff0c;“指定对象”时&#xff0c;选择转换。 在“列映…

SQL50题

文章目录 项目地址1. .查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号2. 查询没学过“张三”老师课的学生和学号3. 查询同时满足学过01和02课程的学生的学号和姓名(子查询)4. 查询没有学全所有课的学生学号和姓名5. 查询至少有一门课与学号为“01”的学生所…

Docker实践与应用举例:从入门到进阶

Docker实践与应用举例&#xff1a;从入门到进阶 在云计算和微服务架构日益盛行的今天&#xff0c;Docker作为一种轻量级的容器化技术&#xff0c;凭借其高效、灵活、可移植的特点&#xff0c;迅速成为了开发和运维团队的首选工具。本文将通过深入浅出的方式&#xff0c;探讨Do…

PyQt5 在线环境搭建

1.记得升级pip&#xff0c;升级后就会一路畅通的安装&#xff0c;无论是在终端通过命令安装&#xff0c;还是在pycharm中&#xff0c;通过设置&#xff0c; python -m pip install --upgrade pip 升级后安装pyqt5,pyqt5-tools,pyqt5-stubs。 命令安装 pycharm->设置&…

goframe开发一个企业网站 rabbitmq队例15

RabbitMQ消息队列封装 在目录internal/pkg/rabbitmq/rabbitmq.go # 消息队列配置 mq:# 消息队列类型: rocketmq 或 rabbitmqtype: "rabbitmq"# 是否启用消息队列enabled: truerocketmq:nameServer: "127.0.0.1:9876"producerGroup: "myProducerGrou…

第8章 利用CSS制作导航菜单

8.1 水平顶部导航栏 水平莱单导航栏是网站设计中应用范围最广的导航设计&#xff0c;一般放置在页面的顶部。水平 导航适用性强&#xff0c;几乎所有类型的网站都可以使用&#xff0c;设计难度较低。 如果导航过于普通&#xff0c;无法容纳复杂的信息结构&#xff0c;就需要在…

JavaScript Cookie 与 服务器生成的 Cookie 的区别与应用

JavaScript Cookie 与 服务器生成的 Cookie 的区别与应用 Cookie是一种甜点&#xff0c;同时也是web前端开发中一种非常常见且重要的技术&#xff0c;它用于在客户端和服务器之间存储和传递信息。用户身份验证、会话管理&#xff0c;还是用户个性化设置&#xff0c;都离不开Coo…

【C#/C++】C++/CL中String^的含义和举例,C++层需要调用C#层对象时...

示例&#xff1a; String^ IDataServer::GetParam(String^ aParamName){ /// }在 C/CLI 中&#xff0c;String^ 和 IDataServer::GetParam(String^ aParamName) 这种写法是一种混合了 C 和 .NET 的语法&#xff0c;用于在 C 中操作 .NET 对象。C/CLI 是微软扩展的 C 语言&…

创客节小学组C++模拟题

来源:加码未来2024年深圳罗湖区创客节模拟题(小学组) 第一题 题目描述 给你n个数,找出出现次数超过一半的数。题目保证这样的数一定存在。 输入格式 第一行一个整数n,(n<=1000) 第二行n个整数(<1000000) 输出格式 输出一个整数 样例输入 5 1 2 3 3 3 样例输…

将数据上传至hdfs的两种方式:java代码上传、将数据放入kafka中,通过flume抽取

目录 1、 生成一条&#xff0c;使用 java 代码将数据放入hdfs上传。 2、 生成一条&#xff0c;编写kafka生产者&#xff0c;将数据放入kafka。kafka source-->flume -->hdfs sink 场景题&#xff1a; 使用 java 代码随机生成学生信息&#xff0c;学生的学号从 0001 开…

微信小程序原生 canvas画布截取视频帧保存为图片并进行裁剪

html页面&#xff1a; 视频尺寸过大会画布会撑开屏幕&#xff0c;要下滑 尺寸和视频链接是从上个页面点击传过来的&#xff0c;可自行定义 <canvas id"cvs1" type"2d" style"width: {{videoWidth}}px;height: {{videoHeight}}px;"><…

【Linux】软件安装目录的选择

根据 FHS Referenced Specifications /home 是用来放用户文档和个人文件的&#xff0c;不是应用。/opt 是用来放发行版的扩展应用&#xff0c;比如应用商店、计算器之类的&#xff08;有的不会放在这儿&#xff0c;例如 Ubuntu&#xff09;。/usr/lib 则是用于编程和包的库&am…