Hbase的学习之路
一、初识Hbase
简介
HBase是一个面向列式存储的分布式数据库。其底层存储基于HDFS实现,集群的管理基于ZooKeeper实现。HBase良好的分布式架构设计为海量数据的快速存储,随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据灾容,是大数据领域中K-V 数据结构存储最常用的数据方案。
HBase特点
易扩展
主要体现在两个方面,一基于运算能力的扩展,通过增加RegionServer节点的数量,提升Hbase上层的处理能力,另一个是基于存储能力的扩展(HDFS),通过增加DataNode节点数量对存储层进行扩容,提升HBase的数据存储能能力。
海量存储
HBase作为开源的分布是K-V数据库,其主要作用是面向PB级别数据的实时入库和快速随机访问,这主要源于上述易扩展的特点,是得HBase通过扩展来存储海量的数据。
列式存储
Hbase是根据列族来存储数据,列族下面可以由非常多的列,列式存储的最大好处就是,其数据再表中是按照某列促成农户的,这样再查询只需要少数几个字段时,能大大减少读取的数据量。
高可靠性
WAL机制保证了数据写入时不会因集群异常而导致写入数据丢失,Replication机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏,而且Hbase底层使用HDFS,HDFS本身也有备份
稀疏性
在HBase的列族中,可以指定任意多的列,为空的列不占存储空间,表可以设计的非常稀松
模块组成
HBase 可以将数据存储在本地文件系统,也可以存储在 HDFS 文件系统。在生产环境中,HBase 一般运行在 HDFS 上,以 HDFS 作为基础的存储设施。HBase 通过 HBase Client 提供的 Java API 来访问 HBase 数据库,以完成数据的写入和读取。HBase 集群主由HMaster、Region Server 和 ZooKeeper 组成。
HMaster
负责管理RegionServer,实现负载均衡
管理和分配Region,如在Region split时分配新的Region,在RegionServers退出时迁移其内的Region到其他RegionServer上
管理namespace和table的元数据
权限控制(ACL)
RegionServer
存储和管理本地Region
读写HDFS,管理Table中的数据
Client从HMaster中获取元数据,找到RowKey所在的RegionServer读取数据
ZooKeeper
存放整个HBase集群的元数据以及集群的状态信息
实现HMaster住从节点的fallower
HBases与传统关系数据库的对比:
1.数据类型 :关系型数据库有丰富的数据类型和存储方式。HBase则使用简单的字符串
2.数据操作:关系型数据库包含基本操作和多表联查。HBase只有简单的基本操作
3.存储模式: 关系型数据库采用行式存储。 HBase采用列式存储
4.数据索引:关系型数据库针对不同的列构建多个索引。 HBase只有一个索引-行键。
5.数据维护:关系型数据库中更新数据时将新的数据覆盖旧的数据。而HBase则不会删除旧版本,而是直接生成新版本
6.可伸缩性:关系型数据库在行和列伸缩上都有一定的限制。HBase在行列上有具有一定的伸缩性
二、HBase数据模型
HBase的数据模型与BigTable十分相思。一个数据拥有一个全局唯一的键(RowKey)和任意数量的列(Column)一列或多列组成一个列族(Column Family),同一个列族中的列的数据在物理上都存储在同一个HFile中,这样基于列存储的数据结构由利于数据缓存和查询。HBase中的表是疏松地存储的,因此与用户可以动态地为数据定义各种不同的列。HBase中的数据按主键排序,同时,HBase会将表按主键划分为多个Region存储在不同RegionServer上,一完成数据的分布式存储和读取。
1.Column Family
Column Family 即列族,HBase 基于列划分数据的物理存储,一个列族可以包含包意多列。
一般同一类的列会放在一个列族中,每个列族都有一组存储属性:
- 是否应该缓存在内存中;
- 数据如何被压缩或行键如何编码等。
- HBase 在创建表的时候就必须指定列族。
HBase的列族不是越多越好,官方荐一个表的列族数量最好小于或者等于3,过多的列族不利于 HBase 数据的管理和索引。
2.RowKey
RowKey的概念与关系型数据库中的主键相似,HBase 使用 RowKey 来唯一标识某行的数据。
访问 HBase 数据的方式有三种:
- 基于 RowKey的单行查询;
- 基于RowKey的范围查询;
- 全表扫描查询。
3.Region
HBase 将表中的数据基于 RowKey 的不同范围划分到不同 Region 上,每个Region都负责一定范围的数据存储和访问。
每个表一开始只有一个 Region,随着数据不断插入表,Region 不断增大,当增大到一个阀值的时候,Region 就会等分成两个新的 Region。当table中的行不断增多,就会有越来越多的 Region。
另外,Region 是 Hbase 中分布式存储和负载均衡的最小单元,不同的 Region 可以分布在不同的 HRegion Server上。但一个Hregion是不会拆分到多个server上的。
这样即使有一个包括上百亿条数据的表,由于数据被划分到不同的 Region上,每个 Region 都可以独立地进行写入和查询,HBase 写查询时候可以于多 Region 分布式并发操作,因此访问速度也不会有太大的降低。
4.TimeStamp
TimeStamp 是实现 HBase 多版本的关键。在HBase 中,使用不同 TimeStamp 来标识相同RowKey对应的不同版本的数据。相同 RowKey的数据按照 TimeStamp 倒序排列。默认查询的是最新的版本,当然用户也可以指定 TimeStamp 的值来读取指定版本的数据。
三、列式存储应用在OLAP中
四、HBase的架构组成
HBase作为NoSQL的数据库代表,属于三驾马车之一,BiTable的对应实现。
HBase 的核心架构由五部分组成,HBase Client、HMaster、Region Server、ZooKeeper 以及 HDFS。它的架构组成如下图所示。
结构组成的详细介绍:
1.HBase Client
HBase Client 为用户提供了访问HBase的接口,可以通过元数据表来定位到目标数据的RegionServer,另外HBase Client 还维护了对应的cache来加速HBase的访问。
2.HMaser
HMaster是HBase集群的主节点,负责整个集群的管理工作,主要工作职责:
分配Region: 负责启动时候分配Region到具体的RegionServer;
负载均衡: 一方面负责将用户的数据均衡地缝补在各个RegionServer上,防止RegionServer数据倾斜过载。另一方面负责将用户的请求均衡地缝补在各个RegionServer上。
维护数据:发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer 上,
并且在Region Sever 失效的时候,协调对应的HLog进行任务的拆分。
3.Region Server
Region Server 直接对接用户的读写请求,是真正的干活的节点,主要工作职责如下。
- 管理 HMaster 为其分配的 Region;
- 负责与底层的 HDFS 交互,存储数据到 HDFS;
- 负责 Region 变大以后的拆分以及 StoreFile 的合并工作。
与HMaster协同:当某个RegionServer宕机之后,ZK通知Master进行失效备援。下线的RegionServer负责的Region暂时停止对外提供服务,Master将该该RS负责的Region转移到其他RS上。
一个Region Server 包含多个Region
**Region: **每一个Region都有起始的RowKey和结束RowKey,代表了存储的Row的范围,保存这表中某段连续的数据。一开始每个表只有一个Region,随着数据量不断增加,当Region大小达到一个阈值时,将其切分成两个新的Region。当Region很多时,HM会将Region保存到其他RS上
**Store:**一个Region由多个Store组成,每个Strore都对应一个Column Family. Strore包含MemStrore和StoreFile
MemStrore:作为HBase的内存数据存储,数据的写操作会先写道MenStore中,当数据增长到一个阈值后,RS会启动 flasheatch 进程将MemStore中的数据写入StoreFile持久化存储,每次写入后都形成一个单独的StoreFile当客户端检索数据时,现在MemStore中查找,如果MemStrore中不存在,则会在StoreFile中继续查找。
StoreFile:MemStrore内存中的数据写到文件后就是StroreFile,StroreFile底层十一HFile的格式保存。
HBase以Store的大小来判断是否需要切分Region
**HFile:**HFile 和 StoreFile 是同一个文件,
只不过站在 HDFS 的角度称这个文件为HFile,站在HBase的角度就称这个文件为StoreFile。
HLog:负责记录着数据的操作日志,当HBase出现故障时可以进行日志重放、故障恢复。
例如,磁盘掉电导致 MemStore中的数据没有持久化存储到 StoreFile,这时就可以通过HLog日志重放来恢复数据。
4.ZooKeeper
HBase 通过 ZooKeeper 来完成选举 HMaster、监控 Region Server、维护元数据集群配置等工作,主要工作职责如下:
5.HDFS
HDFS为HBase提供底层数据存储服务,同时为HBase提供高可用的支持
HBase将HLog存储在HDFS上,当服务器发生异常宕机时,可以重放HLog来恢复数据。
五、HBase的写入流程
Region Server寻址:
1.HBase Client访问ZooKeeper;
2.获取写入 Region 所在的位置,即获取 hbase:meta 表位于哪个 Region Server;
3.访问对应的 Region Server;
4.获取 hbase:meta 表,并查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 Region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问;
写 Hlog
- HBase Client 向 Region Server 发送写 Hlog 请求;
- Region Server 会通过顺序写入磁盘的方式,将 Hlog 存储在 HDFS 上;
写 MemStore 并返回结果
HBase Client 向 Region Server 发送写 MemStore 请求;
只有当写 Hlog 和写 MemStore 的请求都成功完成之后,并将反馈给 HBase Client,这时对于整个 HBase Client 写入流程完成。
MemStore 刷盘
HBase 会根据 MemStore 配置的刷盘策略定时将数据刷新到 StoreFile 中,完成数据持久化存储。
六、HBase的读流程
Region Server 寻址
HBase Client 请求 ZooKeeper 获取元数据表所在的 Region Server的地址。
Region 寻址
HBase Client 请求 RegionServer 获取需要访问的元数据,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以 及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
数据读取
HBase Client 请求数据所在的 Region Server,获取所需要的数据。 Region 首先在 MemStore 中查找,若命中则返回;如果在MemStore 中找不到,则通过 BloomFilter 判断数据是否存在;如果存在,则在:StoreFile 中扫描并将结果返回客户端。
七、HBase 的数据删除
HBase 的数据删除操作并不会立即将数据从磁盘上删除,因为 HBase 的数据通常被保存在 HDFS 中,而 HDFS 只允许新增或者追加数据文件,所以删除操作主要对要被删除的数据进行标记。
当执行删除操作时,HBase 新插入一条相同的 Key-Value 数据,但是
keyType=Delete,这便意味着数据被删除了,直到发生 Major_compaction 操作,数据才会真正地被从磁盘上删除。
HBase这种基于标记删除的方式是按顺序写磁盘的的,因此很容易实现海量数据的快速删除,有效避免了在海量数据中查找数据、执行删除及重建索引等复杂的流程。
八、hbase shell
基本操作
进入 hbase shell
查看集群状态 status
查看版本号 version
查看登录用户 whoami
**操作表 **
查看表空间 list_namespace
创建表空间
create_namespace 'lihaozhe',{"author"=>"lihaozhe", "create_time"=>"2023-05-07 11:36:00"}
描述表空间
list_namespace_tables 'lihaozhe'
查看某表空间下有哪些表
list_namespace_tables 'lihaozhe'
删除表空间
drop_namespace 'lihaozhe'
指定命名空间创建表并指定列族
create 'lihaozhe:person', {NAME => 'info', VERSIONS => 5} , {NAME => 'msg', VERSIONS => 5}
禁用表
disable 'lihaozhe:user'
验证表是否被禁用
is_disabled 'lihaozhe:user'
启用表
enable 'lihaozhe:user'
插入数据到表
put 'lihaozhe:person','1001','info:name','user1001'
put 'lihaozhe:person','1001','info:gender',1
put 'lihaozhe:person','1001','msg:slogan','hello world'
put 'lihaozhe:person','1002','info:name','user1002'
put 'lihaozhe:person','1002','info:gender',0
put 'lihaozhe:person','1002','msg:slogan','hello'
put 'lihaozhe:person','1003','info:name','user1003'
put 'lihaozhe:person','1003','info:gender',1
put 'lihaozhe:person','1003','msg:slogan','hi'
查询
扫描全表中的数据
scan 'lihaozhe:person'
按照指定 RowKey 查询
get 'lihaozhe:person', '1001'
查询某 RowKey 下某列簇的值
get 'lihaozhe:person', '1001' , 'info'
查询表中某行+某一列簇+某一列的值
get 'lihaozhe:person', '1001' , 'info:name'
更新指定字段的数据
put 'lihaozhe:person','1001','info:gender',0
统计数据
count 'lihaozhe:person'
删除指定数据
delete 'lihaozhe:person','1001','msg:slogan'
删除某RowKey下所有数据
deleteall 'lihaozhe:person','1001'
清空表
truncate 'lihaozhe:person'