第四章 非关系型分布式数据库HBase

本文深入介绍了HBase,一种基于HDFS和Zookeeper的高可靠性、高性能分布式列式数据库。HBase适用于大规模数据存储,如对象存储、时序数据、气象数据和实时报表分析等场景。文章详细阐述了HBase的数据模型,包括行键、列族、列限定符和时间戳,以及行存储与列存储的区别。此外,还解析了HBase的体系架构,包括HMaster、RegionServer和Zookeeper的角色,以及数据读写流程。最后,讨论了HBase的性能优化策略,如行键设计和二级索引的构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第四章 非关系型分布式数据库HBase

本篇简单介绍了HBase,和它的使用场景,产品定位,以及数据库的一些数据存储知识, keyvalue,接着从服务分别介绍了RegionServer, HMaster, Zookeeper,HBase的数据写入和读取流程。

1. HBase简介

HBase是一个高可靠,高性能,面向列,可伸缩的分布式存储系统。

  • 适合存储大表数据(表的规模达数十亿行以及数百万列),并且读写访问可达实时级别

    BigTable 是一个疏松的分布式的持久的多维排序的map,这个map有行健、列键和时间戳索引,每一个值都是连续的byte数组

  • 利用HDFS作为文件存储系统

  • 利用Zookeeper作为协同服务

    1. 分布式锁 2. 事件监控 3. Region Server数据的存储

1.1 HBase与RDB的对比

HBaseRDB
数据索引只有一个索引----行键,所有访问方法,要么通过行键访问,要么通过行键扫描 ,保障查询效率可以针对不同列构建复杂的多个索引
数据维护追加新版本,旧版本保留直接替换
可伸缩性拓展容易,增加集群硬件数量横向拓展困难,纵向拓展空间有限

1.2 HBase应用场景

在这里插入图片描述

内容特点
对象存储1B~100M 对象存储(图片、网页、文本、新闻)海量存储
时序数据时间序列数据(传感器、监控数据、股票K线)高并发/海量存储
气象数据卫星轨道、气象数据高并发/海量存储
Cube分析实时报表高并发/海量存储
NewSQL元数据库、索引查询SQL、二级索引、动态列
Feeds流朋友圈高并发请求
消息/订单存储聊天信息、订单/保存存储强同步 海量数据
用户画像用户特征存储万列稀疏矩阵
兼容结构化/非结构化数据数据库容量大,高并发,低时延,低成本

2. HBase数据模型

2.1 HBase表结构

在这里插入图片描述
在这里插入图片描述

组成解释
表(Table)组织数据的单位
每个行由行键(Row Key)唯一标识
列族(Column Family)一个表被分为多个列族的集合,是基本的访问控制单元
列限定符
单元格(Cell)HBase表中,通过行,列族,列确定一个单元格,单元格存储的数据没有数据类型,总被视为字节数组byte[]
时间戳(Time Stamp)每个单元格数据保留多个版本,通过时间戳来索引

2.2 行存储与列存储

行存储列存储
架构在这里插入图片描述在这里插入图片描述
优点增加/修改/读取整行记录速度快单列数据读取/统计速度快
缺点单列查询/统计效率低整行读取需要多次IO操作

3. HBase体系架构

在这里插入图片描述

组件功能
ZookeeperZookeeper为集群各进程提供分布式协作服务,各RegionServer将自己的信息注册到Zookeeper中,主用Hmaster据此感知各RegionServer的健康状态
ClientClient使用HBase的RPC机制与Hmaster,RegionServer进行管理类与数据类通信
RegionServerRegionServer提供表数据读写等服务,是HBase的数据处理与计算单元,RegionServer一般与HDFS集群的DataNode部署在一起,实现数据的存储功能
主HmasterRegionServer的管理,包括表的增删改查,RegionServer的负载均衡,Region分布调整,Region分裂以及分配,RegionServer失效后的Region迁移等
备Hmaster主用故障时,对外服务,故障恢复后,原主用降为备用
HDFSHDFS为HBase提供文件存储服务

在这里插入图片描述
在这里插入图片描述
HBase的架构包括三个主要的功能组件:

  • 库函数:链接到每个客户端
  • Hmaster主服务器
  • 多个HRegionServer服务器
MemStoreStoreFile
当RegionServer中的MemStore大小达到配置的容量上限时, RegionServer会将MemStore中的数据“flush”到HDFS中随着数据的插入,一个Store会产生多个StoreFile,当StoreFile的个数达到配置的最大值时, RegionServer会将多个StoreFile合并为一个大的StoreFile
组件功能
HMaster管理维护HBase的分区信息,维护HRegionServer列表,分配Region,负载均衡
HRegionSever维护分配给自己的Region,处理来自客户端的读写请求
Client从Zookeeper获取Region位置信息,直接找RegionServer读写,大多数情况不与HMaster通信,HMaster负载很小
Table
	- Region    1 to n
		- Store    1 to n     一个列族(column family)对应一个store
			- MemStore   1 to 1
			- StoreFile    1 to n
				- Block	    1 to n  

3.1 Table与Region

在这里插入图片描述

  • HBase开始只有一个Region,后来不断分裂
  • Region拆分操作非常快,接近瞬间,拆分过程中的region不可读,直到把region存储文件异步地写到独立的文件之后,才会读取新文件

3.2 Region的定位

在这里插入图片描述
Region分为元数据Region以及用户Region两类

  • Meta Region记录了每一个User Region的路由信息
  • 读写Region数据的路由,需要先找Meta Region的地址,再由Meta Region找寻User Region地址

HBase:meta表被保存在Zookeeper中。

假设HBase:meta表的每行(一个映射条目)在内存中大约占用1KB,并且每个Region限制meta表大小为128M,那么二层表结构可以保存的Region数目是128M/1KB = 2^17个Region

3.3 客户端

客户端包含:

  • 访问HBase的接口
  • 缓存已访问的Region位置信息

访问过程:

  • 查询HBase:meta表,然后确定Region的位置
  • 客户端直接访问Region(不经过HMaster)进行读写

4. HBase关键流程

4.1 HBase读流程

在这里插入图片描述

  • 读取数据时,HRegionServer会先访问MemStore缓存,如果找不到,再去StoreFile中寻找
  • 根据时间范围,RowKey范围,以及布隆过滤器缩短定位HFile的时间

4.2 HBase写流程

在这里插入图片描述

  • Client 请求RegionServer地址(Zookeeper中meta表或缓存)
  • 用户数据先写入到HLog(WAL)中,再写入MemStore中,最终写入磁盘StoreFile
  • 只有当操作写入Hlog后,commit()命令才返回给客户端

4.3 HLog

分布式环境必须要考虑系统出错,HBase采用HLog保证系统恢复。

  • HBase系统为每个HRegionServer配置了一个HLog文件,它是一种预写式日志(Write Ahead Log)
  • 用户更新数据必须在写入日志之后,才能写入到MemStore进行缓存,直到缓存内容对应的日志写入到磁盘,缓存内容才能flush到磁盘

Hlog工作原理:

  • Zookeeper实时监测每个HRegionServer的状态,当某个HRegionServer发生故障时,Zookeeper会通知HMaster
  • HMaster首先会处理该故障HRegionServer上面遗留的HLog文件,根据Region对象对HLog数据进行拆分,分别放到相应Region的目录下,然后再重新分配HLog到相应的HRegionServer
  • HRegionServer领取分配给自己的Region对象以及HLog,重新做一遍日志记录中的各种操作,把日志记录中的数据写入MemStore缓存中,然后,刷新到磁盘的StoreFile

多个Region共用日志的优点:提高表的读写性能,缺点是故障时需要分拆。

5. HFile特点

5.1 HFile压缩Compaction

当HFile的数量越来越多,同样的查询,需要同时打开的文件也越来越多,查询时延也越来越大。

Compaction分为两类:

Minor小范围的Compaction,会选择一些连续时间范围的小文件进行合并
Major涉及该Region该ColumnFamily下面的所有HFile文件

在这里插入图片描述

Compaction首先会对File进行一一排查,排除不满足条件的部分文件:

  • 排除当前正在执行compact的文件以及比这些文件更新的所有文件(SequenceId更大)
  • 排除某些过大的单个文件,否则会产生大量IO消耗

经过排除的文件称为候选文件,HBase接下来会判断是否满足major compaction条件,如果满足,就会选择全部文件进行合并,判断条件有3条,只要满足其中一条就会执行major compaction:

  • 用户强制执行major compaction
  • 长时间没有进行compact且候选文件数小于hbase.hstore.compaction.max(默认为10)
  • Store中含有Reference文件,Reference文件是split region产生的临时文件,只是简单的引用文件,一般必须在compact过程删除

如果不满足major条件,就必然为minor

5.2 OpenScanner

在寻找到rowkey所对应的RegionServer和Region之后,需要打开一个查找器Scanner,由其具体执行查找数据, Region中会包含内存数据MemStore,文件数据Hfiles,那么在openscanner的时候就需要分别读取这两块数据,打开对应不同的scanner做查询操作
在这里插入图片描述

  • HFile对应的Scanner为StoreFileScanner
  • MemStore对应的Scanner为MemStoreScanner

5.2 BloomFilter

Bloom用来优化一些随机读取的场景,即Get场景。它可以被用来快速地判断一条用户数据在一个大的数据集合中是否存在。
在这里插入图片描述

  • Bloom在判断一个数据是否‘’存在‘’,具有一定的误判率,但对于一个数据是否‘’不存在‘’的判断结果是可信的
  • HBase的BloomFilter相关数据,被保存在HFile中

6. HBase性能优化

6.1 行键(Row Key)

行键是字典序存储,因此设计行键时要充分利用这一特点,将经常一起读取的数据存储到一起。

比如:最近写入HBase的数据是最可能被访问的,可以考虑将时间戳作为行键的一部分

6.2 构建HBase二级索引

HBase只有一个针对行键的索引。

访问HBase表中的行,只有三种方式:

  • 通过单个行键访问
  • 通过一个行键的区间访问
  • 全表扫描

可以通过Apache Phoenix进行二级索引。
在这里插入图片描述
客户端发起请求时,数据处理模块会对请求进行解析,然后向Phoenix的二级处理模块发起请求,找到对应数据记录的rowkey,然后根据rowkey去查询数据,避免了全表扫描。

6.2.1 Phoenix简介

Apache Phoenix让Hadoop中支持低延迟OLTP和业务操作分析。

  • 提供标准的SQL以及完备的ACID事务支持

  • 通过利用HBase作为存储,让NoSQL数据库具备通过有模式的方式读取数据,我们可以使用SQL语句来操作HBase,例如:创建表、以及插入数据、修改数据、删除数据等

  • Phoenix通过协处理器在服务器端执行操作,最小化客户机/服务器数据传输

在这里插入图片描述

Apache Phoenix可以很好地与其他的Hadoop组件整合在一起,例如:Spark、Hive、Flume以及MapReduce。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值