66.1. NoSQL?

HBase 是一种 "NoSQL" 数据库。"NoSQL" 是一个通用术语,意味着数据库不像 RDBMS 一样支持 SQL 作为主要访问语言,现有许多类型 NoSQL 数据库:BerkeleyDB 是一种本地 NoSQL 数据库,而 HBase 更适合称为分布数据库。从技术上讲,HBase 实际上更像是“数据存储”而不是“数据库”,因为它缺少很多在 RDBMS 中能找到的功能,例如类型列,二级索引,触发器和高级查询语言等。

但是,HBase 具有许多支持线性和模块化缩放的功能。 HBase 集群通过添加托管在商用服务器上的 RegionServer 进行扩展。举个例子,如果一个集群从 10 个 RegionServer 扩展到 20 个,那么它的存储和处理能力都会翻倍。 RDBMS 同样可以很好地扩展,但会达到一个上限 - 特别是单个数据库服务器的大小 - 并且为了获得最佳性能,需要专门的硬件和存储设备。 HBase 的特点是:

  • 强一致读/写:HBase 不是”最终一致”的数据存储。这使得它非常适合高速计数聚合等任务。

  • 自动分片:HBase 表通过 region 分布在集群上,并且随着数据的增长,region 会自动分割和重新分配。

  • RegionServer 自动故障转移

  • 集成 Hadoop/HDFS:HBase 支持 HDFS 作为其分布式文件系统。

  • MapReduce:HBase 可以作为 source 和 sink,通过 MapReduce 来支持大规模并行处理。

  • Java 客户端 API:HBase 支持易用的 Java API 以进行编程式访问。

  • Thrift/REST API:对于非 Java 前端访问,HBase 还支持 Thrift 和 REST 方式。

  • 块缓存和布隆过滤器:HBase 支持块缓存和布隆过滤器,以实现高容量查询优化。

  • 运维管理:HBase 提供内置网页监控运维情况,并支持 JMX 指标。

66.2. 什么时候应该使用 HBase?

HBase 并不适合解决所有问题。

第一,确认有足够的数据。如果有上亿或数十亿行数据,那么 HBase 是一个好的选择。如果只有几千或几百万行数据,那么使用传统的 RDBMS 或许是个更好的选择,因为全部数据可能会被调度到单独一个(或者两个)节点上,集群的其他节点可能是空闲的。

第二,确认可以不用 RDBMS 提供的所有额外功能(例如,类型列,二级索引,事务,高级查询语言等)。针对 RDBMS 构建的应用程序无法通过简单地更改 JDBC Driver 就“移植”到 HBase。从 RDBMS 迁移到 HBase 需要完全重新设计而不是移植。

第三,确认有足够的硬件设施。少于 5 个 DataNode 时,HDFS 甚至什么都做不了(由于诸如 HDFS 块复制默认值为 3 之类的情况),再加上 NameNode。

HBase 可以在笔记本电脑上独立运行 - 但是这只应该被当做开发配置

66.3. HBase 和 Hadoop/HDFS 有什么不同?

[HDFS](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)是一个分布式文件系统,非常适合存储大型文件。其文档指出,它不是通用文件系统,并且不提供文件中的快速单个记录查找。另一方面,HBase 建立在 HDFS 之上,为大型表提供快速记录查找(和更新)。有时这可能是概念混淆的点。 HBase 内部将数据放在有索引的“StoreFiles”中,存储在 HDFS 之上,以进行高速查找。有关 HBase 如何实现其目标的更多信息,请参见[数据模型](#datamodel)和本章的其余部分。