【Hadoop】HBase:构建于HDFS之上的分布式列式NoSQL数据库
本专栏文章持续更新,新增内容使用蓝色表示。
在大数据时代,传统关系型数据库面临海量数据存储和高并发访问的挑战。HBase作为Apache Hadoop生态系统中的重要组成部分,提供了一个分布式、可扩展的列式存储解决方案。
一、HBase
HBase 是一个开源的、分布式的、面向列的 NoSQL 数据库,设计灵感来自 Google 的 Bigtable。
注意:"NoSQL"意味着"Not Only SQL",它既支持类 SQL 查询,也提供了原生的 API 操作(如put、get、fetch 等)。
与传统关系型数据库不同,HBase 采用列式存储方式,将同一表中相同列的数据物理存储在一起,这种设计为特定类型的查询带来了显著的性能优势。
1.1 HBase与HDFS的关系
HBase 构建在 HDFS(Hadoop 分布式文件系统)之上,继承了 HDFS 的容错性和扩展性,但两者有显著区别:
特性 | HDFS | HBase |
---|---|---|
数据模型 | 面向文件 | 面向表 |
访问模式 | 批处理、顺序读写 | 随机读写 |
延迟 | 高 | 低 |
更新支持 | 不支持 | 支持 |
索引 | 无 | 行键索引 |
HDFS 本身只支持顺序读写,没有索引,若直接在其上查找数据需要全表扫描,性能极差。而HBase 正是为了解决这一问题而生的。它在 HDFS 之上构建了一个分布式索引系统,通过有序的Row Key、Region 分区、内存缓存和高效的文件格式,将高效的随机读写能力与 HDFS 的可靠性和扩展性结合了起来。
HDFS 适合离线批处理场景,而 HBase 适合需要实时随机读写的场景。对 HDFS 中的数据进行事务处理时必须借助 HBase。
1.2 HBase表的特点
1)HBase 表可以容纳数十亿行和上百万列,适合海量数据存储。
2)无模式设计,每行都有一个可排序的主键(行键)和任意多的列,列可以根据需要动态增加,同一表中不同行可以有完全不同的列结构。
3)面向列存储,数据按列族存储,每个列族物理上存储在一起,支持独立的检索和权限控制。
4)稀疏存储,为空值( null )的列不占用存储空间,表可以设计得非常稀疏而不浪费存储资源。
4)每个单元格中的数据可以有多版本,默认版本号是插入时的时间戳,支持基于时间的数据检索。
5)HBase 本身不感知复杂的数据类型,所有数据(行键、列族、列限定符、值)在底层均以字节数组( byte[] )的形式存储和管理。数据的类型化和解析工作交由客户端应用程序处理。。
1.3 HBase物理存储结构
表中所有行按照行键( row key )的字典序排列,这种排列方式支持高效的范围查询。
表在行方向上分割为多个 Region,每个 Region 包含一段连续的行键范围。Region 是 HBase 中分布式存储和负载均衡的最小单元。
每个表初始只有一个 Region,随着数据增多,Region 不断增大,当达到阈值时会等分为两个新的 Region,分布到不同的 RegionServer 上。
存储层次结构
-
Region 由一个或多个 Store 组成,每个 Store 对应一个列族
-
每个 Store 包含一个内存中的 memStore 和 0 到多个 HDFS 上的 StoreFile
-
数据先写入 memStore,达到一定大小后刷写到 StoreFile
二、HBase架构
2.1 Client
提供访问 HBase 的接口,并维护缓存加速对 HBase 的访问。
2.2 ZooKeeper
-
保证集群中只有一个活跃 Master;
-
存储所有 Region 的寻址入口;
-
实时监控 RegionServer 状态并通知 Master;
-
存储 HBase 的 schema 和表元数据。
ZooKeeper的关键作用
HBase 默认管理 ZooKeeper 实例,Master 和 RegionServers 启动时向 ZooKeeper 注册。ZooKeeper 的引入使 Master 不再是单点故障,提高了系统的可靠性。
【Hadoop】ZooKeeper:分布式系统的协调核心与一致性保障-CSDN博客
2.3 Master
-
为 RegionServer 分配 Region;
-
负责 RegionServer 的负载均衡;
-
处理失效的 RegionServer 并重新分配其上的 Region;
-
管理用户对表的增删改查操作。
2.4 RegionServer
-
维护 Region,处理对这些 Region 的 IO 请求;
-
负责切分过大的 Region。
三、HBase的容错机制
3.1 Master容错
ZooKeeper 会重新选择新的 Master。无 Master 过程中,数据读取仍照常进行,但 Region 切分、负载均衡等管理操作无法进行。
3.2 RegionServer容错
RegionServer 定时向 ZooKeeper 汇报心跳,若一段时间内未出现心跳,Master 会将该RegionServer 上的 Region 重新分配到其他 RegionServer 上。
3.3 ZooKeeper容错
通常配置3或5个 ZooKeeper 实例组成集群,确保服务的高可用性。
四、HBase在Hadoop生态系统中的位置
MapReduce 直接顺序读取 HDFS,全表扫描效率低,且编写 MapReduce 程序较为复杂。
【Hadoop】Yarn:Hadoop 生态的资源操作系统_大数据平台 yarn-CSDN博客
Hive 提供类 SQL 语句( HQL )操作,将 HQL 转换为 MapReduce 程序执行,但仍为顺序读取,适合批处理场景。
【Haddop】Hive的离线分析与Sqoop的数据集成-CSDN博客
HBase 将数据存储在表中,支持随机读取,效率较高,适合实时查询场景。
三者关系:MapReduce 直接访问 HDFS,Hive 间接访问 HDFS,而 HBase 提供了完全不同的随机访问数据模型。
4.1 HBase适用场景
需对数据进行随机读操作或随机写操作
大数据上高并发操作(如每秒对 PB 级数据进行上千次操作)
读写访问均为简单操作
需要高度可扩展性和容错性的应用
【补充】传统关系型数据库的行迁移与行链接
行迁移
当一行记录被更新导致变长,且当前数据页没有足够空间时发生。数据库将整行数据移动到新数据页,在原始位置留下指向新位置的指针。读取时需要至少两次I/O操作。
行链接
当一行数据初始插入时就非常大,一个数据页无法存下整行数据时发生。数据库将数据分割成多个片段存储在不同数据页中,并通过链表连接。
区别与解决方案
行链接发生在插入时,而行迁移发生在更新时。现代计算机通过段重组在系统空闲时回收碎片化空间并消除行迁移。
如有问题或建议,欢迎在评论区中留言~