HBase 的优点、缺点和性能瓶颈
什么是 HBase?
HBase 是一个开源的、分布式的、面向列的 NoSQL 数据库,运行在 Hadoop 分布式文件系统 (HDFS) 之上。 Google Bigtable 将数据存储在由行和列族组成的表中,专为稀疏数据集而设计,这些数据集可以增长到数十亿行和数百万列。
与关系型数据库不同,HBase 不使用固定模式,也不提供查询优化器。相反,每个值都由行键、列族、列限定符和时间戳来寻址,这使得即使在大规模数据的情况下,随机实时读写操作也能快速完成。
一个 HBase 集群依赖于几个核心组件。HMaster 负责协调集群并分配区域,Region Server 负责存储和提供实际数据,而 Apache 服务器则负责提供数据服务。 动物园管理员 tracks 指示哪些服务器处于活动状态,并有助于故障转移。由于 HBase 位于 Hadoop 生态系统中,因此它可以与以下工具协同工作: 映射简化, 蜂房以及用于批量分析的 Pig。要深入了解其内部机制,请参阅…… HBase架构.
HBase的优势
使用 HBase 的主要优势如下:
- 在 HDFS 之上存储海量数据集,并可聚合和分析 HBase 表中保存的数十亿行数据。
- 在分布式环境中,数据库可以被多个客户端共享。
- 与传统关系模型相比,数据读取和处理所需时间更少。
- 支持快速随机读写操作。
- HBase被广泛用于在线分析操作。
- 在银行应用中,例如 ATM 的实时余额更新,HBase 可以可靠地处理大量读写操作。
HBase 的缺点
以下是HBase的一些重要局限性:
- HBase 并不能完全替代传统的关系模型;某些关系型功能不受支持。
- HBase 无法执行诸如以下功能: SQL它不支持 SQL 结构,因此没有查询优化器。
- HBase 属于 CPU 和内存密集型任务,需要进行大量的顺序输入/输出访问,而 MapReduce 任务大多是 I/O 密集型任务,内存使用量固定。将 HBase 与 MapReduce 任务集成可能会导致不可预测的延迟。
- 将 HBase 与 Pig 和 Hive 作业集成有时会导致集群内存问题。
- 在共享集群环境中,该设置需要为每个节点分配更少的任务槽位来满足 HBase CPU 需求。
HBase 中的性能瓶颈
HBase 提供了可扩展性,但一些架构选择会造成性能瓶颈,团队应该围绕这些瓶颈进行规划:
在大型生产环境中,HBase 集群可以运行在数千个节点上,但只有 HMaster 作为所有从属 RegionServer 的主节点。如果 HMaster 发生故障,即使客户端仍然可以访问 RegionServer,恢复过程也可能需要很长时间。虽然可以运行备用主节点,但同一时间只能有一个 HMaster 处于活动状态,而且在故障发生后将第二个 HMaster 提升为主节点并非瞬时完成。因此,HMaster 被公认为是性能瓶颈。
HBase 本身并不直接支持跨表或连接操作。虽然可以使用 MapReduce 实现连接,但这会显著增加设计和开发时间,而且某些表连接在 HBase 中实际上并不实用。
将数据从外部关系数据库管理系统 (RDBMS) 迁移到 HBase 通常需要重新设计数据库模式,而且迁移过程可能耗时很长。查询也比较困难:许多团队会在 HBase 之上添加 SQL 层(例如 Apache Phoenix),以便能够…… 读取和写入数据 提出一些熟悉的问题。
HBase 仅支持单个索引——行键充当主键——因此对任何其他字段的搜索速度都很慢。团队通过编写 MapReduce 代码或集成 Apache 来解决这个问题。 Solr的 以及用于二级索引的 Apache Phoenix。
- 多用户数据访问的安全控制措施改进缓慢。
- HBase 不完全支持部分键。
- 每个表只允许设置一个默认排序顺序。
- 在 HBase 中存储大型二进制文件很困难。
- HBase 存储限制了实时查询和排序。
- 对表内容进行键查找和范围查找可以限制必须实时运行的查询。
- 默认索引缺失;程序员必须编写额外的代码或脚本来添加索引。
- 硬件要求和内存块分配使得 HBase 的运行成本很高。
- 分布式集群需要许多服务器——NameNode、DataNode、ZooKeeper 和 Region Server 都需要单独的节点。
- 要获得良好的性能,需要配备大内存的机器。
- 总体成本和维护费用高于更简单的替代方案。
HBase 与关系数据库管理系统 (RDBMS) 的比较
文章反复对比了 HBase 与传统关系型数据库。下表总结了主要区别,以便您确定哪种模型更适合您的工作负载:
| 特性 | HBase的 | RDBMS |
|---|---|---|
| 数据模型 | 面向列、模式灵活的 NoSQL 存储 | 具有固定模式的面向行的表 |
| 查询语言 | 不支持原生 SQL;需要 API 或类似 Apache Phoenix 的附加层。 | 带有查询优化器的完整 SQL |
| 缩放 | 横向,跨商品节点(PB级) | 主要为垂直方向;难以横向扩展 |
| 交易 | 仅支持行级原子性;不支持多行 ACID | 完整的 ACID 交易 |
| 连接和索引 | 不支持原生连接;单行键索引 | 原生连接和多个二级索引 |
| 最合适 | 稀疏、海量、高写入量的实时数据 | 需要复杂查询的结构化数据 |
简而言之,HBase 更注重可扩展性和实时访问,而关系型数据库管理系统 (RDBMS) 则更注重丰富的查询功能和强一致性。当数据量和写入吞吐量超过关系型数据库的处理能力时,应选择 HBase。

