HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统” 。就像 Bigtable 利用了 Google 文件系统(File System)所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。HBase 是 Apache 的 Hadoop 项目的子项目。HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是 HBase 基于列的而不是基于行的模式。
HBase 以表的形式存储数据。表由行和列组成。列划分为若干个列簇(column family),如下图所示。
RowKey 可以使用任意字符串(最大长度为 64KB,实际应用中长度一般为 10 ~ 100bytes),在 HBase 内部,Row Key 保存为字节数组。
在 HBase 使用过程中,设计 RowKey 是一个很重要的环节。我们在进行 RowKey 设计的时候可参照如下步骤:
与 NoSQL 一样,RowKey 是用来检索记录的主键。访问 HBase table 中的行,只有三种方式:
物理存储上 HBase 将 Table 在行的方向上分割为多个 HRegion, 每个 HRegion 分散在不同的 HRegionServer 中。
每个 HRegion 由多个 Store 构成, 每个 Store 由一个 memStore 和0或多个 StoreFile 组成, 每个 Store 保存一个 Columns Family。
HBase 中的组件包括 Client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog 等。
HBase 中的每张表都通过行键(RowKey)按照一定的范围被分割成多个子表(HRegion),一个 HRegion 超过一定阈值就要被分割成两个,这个过程由 HRegionServer
管理, 而 HRegion 的分配由 HMaster
管理。
HMaster 仅仅维护 table 和 HRegion 的元数据信息,而 table 的元数据信息保存在 zookeeper 上,因此,HMaster 的负载很低。
table 在行的方向上分割为多个 HRegion ,HRegion 是 HBase 中分布式存储和负载均衡的最小单元,即不同的 HRegion 可以分布在不同的 HRegion Server 上,但同一个 HRegion 是不会拆分到多个 HRegion Server 上。
HRegion 按大小分割,每个表一般只有一个 HRegion ,随着数据不断的插入表,HRegion 不断增大,当 HRegion 的某个列簇达到一定的阈值时就会分成两个新的 HRegion 。
HBase 依赖 Zookeeper,默认情况下 HBase 管理 Zookeeper 实例(启动或关闭 Zookeeper),HMaster 与 HRegionServers 启动时会向 Zookeeper 注册,使 HMaster 可以随时感知到各个 HRegionServer 的健康状态。
首先当一个请求发生时,HBase Client 使用 RPC 机制与 HMaster 和 HRegion Server 进行通信。对于管理类操作,Client 与 HMaster 进行 RPC 通信;对于数据读写操作,Client 与 HRegion Server 进行 RPC 通信。
HBase Client 使用 RPC 机制与 HMaster 和 HRegion Server 进行通信,但如何寻址呢?由于 Zookeeper 中存储了 Meta 表的地址和 HMaster 的地址,所以 HBase Client 需要先到 Zookeeper 上进行寻址。
HBase Client 访问 Zookeeper,可以根据 Meta 表获取到 HRegion Server 地址。