Hbase 是 Hadoop 的一个存储组件可以提供低延迟的读写操作, 它一般构建在 HDFS 之上, 可以处理海量的数据. Hbase 有个很好的特性是可以自动分片, 也就是意味着当表的数据量变得很大的时候, 系统可以自动的分配这些数据.
Region 与 Region Server
Hbase 的基本存储单位是 Region,Region 是表数据的子集, 多个 Region 的数据集合可以组成一张完成的表数据. Region 本质上存储的一些排好序的, 连续的行数据. 最初的时候一张表只有一个 Region, 当 Region 变得非常大的时候, Region 就会从中间分裂成两个基本等大的 Region.
image-20190309213627971
在 Hbase 中, slave 也被称作 RegionServer, 每个 RegionServer 负责管理一些 Region, 同时一个 Region 只能属于一个 RegionServer.
Region 分配
一个 RegionServer 可以服务一个或多个 Region, 每个 Region 在 Region Server 启动的时候被分配. Master 可以决定将一些 Region 从一个 RegionServer 中移动到令一个 RegionServer 里面, 以便更好的负载均衡. 当某个 RegionServer 故障的时候, Master 也可以将它的 Region 分配给其他的 RegionServer.
Region 与 RegionServer 之间的映射关系存储在 Zookeeper 中的 META 表中, 通过读取 META 表, 你就可以知道那个 Region 可以负责处理你的 rowkey 操作, 其实这也代表着在 HBase 读写操作的时候是不用经过 Master 节点的, 你可以之间联系 RegionServer.
如图, 在客户端进行 scan 的时候, 它可以之间联系多个 RegionServer 处理当前的操作.
image-20190309214611246
Meta 表是用来跟踪 Region 的, 它包含服务器的名称, Region 的名称, 表名, 还有 Region 的 startkey. 通过 startkey 的范围, 客户端就可以定位到当前的 key 要去哪一个 Region 了.
客户端在请求过 META 表之后, 一般会将表缓存起来, 防止每次操作都去获取. 在 Region 进行分裂的时候, 客户端去 RegionServer 操作 Region 的时候回返回异常, 然后客户端会重新获取最新的 META 表信息.
客户端 API
Hbase 的 Java 客户端 API 有两个主要的接口:
HBaseAdmin: 创建, 修改, 删除, 更新表, 可以在集群中分配和不分配 Region, 合并 Region, 刷新操作等, 主要与 Master 节点打交道.
HTable: 客户端用来与具体某个表的数据打交道, 获取, 更新, 删除, 增加表的数据, 主要与 Region Server 用来打交道.
最后
通过上面介绍, 可以知道 HBase 虽然是 Master/Slave 架构的, 但是并不是每次操作都经过 Master 的, 读写数据的时候 HBase 只需要直接联系 RegionServer 即可. 这也是 HBase 可以 "无限扩容" 的原因. 在吞吐量不够的时候, 通过增加 RegionServer 节点, 可以增加吞吐量.
来源: http://www.jianshu.com/p/370f10d8a193