hbase自我小结

HBase 是一个分布式的、多版本、面向列的开源 KV 数据库。运行在 HDFS 的基础上,支持 PB 级别、百万列的数据存储。作为性能如此强大的 KV 数据库,HBase的存储结构究竟是怎样的呢?面向列的存储结构究竟有什么样的不同之处呢?接下来会详细讲解这部分

HBase的存储结构

为了清晰地表述这个,我们把HBase的存储结构分为逻辑结构物理结构两个部分。逻辑存储结构通过下图直观地展示 HBase 的逻辑存储结构:

hbase自我小结

在本图中,列簇(Column Family)对应的值就是 info 和 area ,列( Column 或者称为 Qualifier )对应的就是 name 、 age 、 country 和 city ,Row key 对应的就是 Row 1 和 Row 2,Cell 对应的就是具体的值。

Row key :表的主键,按照字典序排序。

列簇:在 HBase 中,列簇将表进行横向切割。

列:属于某一个列簇,在 HBase 中可以进行动态的添加。

Cell : 是指具体的 Value 。

Version :在这张图里面没有显示出来,这个是指版本号,用时间戳(TimeStamp )来表示。

看完这张图,是不是有点疑惑,怎么获取其中的一条数据呢?既然 HBase 是 KV 的数据库,那么当然是以获取 KEY 的形式来获取到 Value 啦。在 HBase 中的 KEY 组成是这样的:
hbase自我小结

KEY 的组成是以 Row key 、CF(Column Family) 、Column 和 TimeStamp 组成的。

TimeStamp 在 HBase 中充当的作用就是版本号,因为在 HBase 中有着数据多版本的特性,所以同一个 KEY 可以有多个版本的 Value 值(可以通过配置来设置多少个版本)。查询的话是默认取回最新版本的那条数据,但是也可以进行查询多个版本号的数据,在接下来的进阶操作文章中会有演示。

Region Server 和 Region 的关系

一个 Region Server 就是一个机器节点(服务器)

一个 Region Server 包含着多个 Region

一个 Region 包含着多个列簇 (CF)

一个 Region Server 中可以有多张 Table,一张 Table 可以有多个 Region

hbase自我小结

物理存储结构

hbase自我小结

为了不混淆,我们可以先把以下的概念一一对应起来

逻辑结构物理结构Region ServerHRegion ServerRegionHRegionCFHStore(这里指的是Store)

在具体的物理结构

中HRegion Server 就是一个机器节点,包含多个 HRegion ,但是这些 HRegion 不一定是来自于同一个 Table ,负责响应的是用户的 IO 请求,和 HDFS 进行交互,是服务器中的一个进程。

HRegion 包含多个 HStore 。

一个 CF 组成一个 HStore ,默认是 10 G,如果大于 10G 会进行分裂。HStore 是 HBase 的核心存储单元,一个 HStore 由 MemStore 和 StoreFile 组成。

MemStore 是一块内存,默认大小是 128M,如果超过了这个大小,那么就会进行刷盘,把内存里的数据刷进到 StoreFile 中。

在 HStore 对应着的是 Table 里面的 Column Family,不管有 CF 中有多少的数据,都会存储在 HStore 中,为了避免访问不同的 HStore 而导致的效率低下。

HRegion 是 Hbase 中分布式存储和负载均衡的最小单元,但不是存储的最小单元。

一个 Hstore 可以有多个 StoreFile

在HBase中查找不同的CF的数据

从不同的 CF 中查询 Row 3 主键的数据

更加直观地显示,在 HBase 中是以 CF 为单元的存储结构。
HBase的架构

Client 是客户端,要求读写数据的发起者。ZK 集群是负责转发 Client 的请求和提供心跳机制,会让 HRegion Server 和 HRegion 注册进来,同时保存着 Rowkey 和 Region 的映射关系。HMaster 中可以有多个待命,只有一个在活跃。Hbase读取数据的过程Client 请求读取数据时,先转发到 ZK 集群,在 ZK 集群中寻找到相对应的 Region Server,再找到对应的 Region,先是查 MemStore,如果在 MemStore 中获取到数据,那么就会直接返回,否则就是再由 Region 找到对应的 Store File,从而查到具体的数据。在整个架构中,HMaster 和 HRegion Server 可以是同一个节点上,可以有多个 HMaster 存在,但是只有一个 HMaster 在活跃。在 Client 端会进行 rowkey-> HRegion 映射关系的缓存,降低下次寻址的压力。HBase 写入数据的过程
先是 Client 进行发起数据的插入请求,如果 Client 本身存储了关于 Rowkey 和 Region 的映射关系的话,那么就会先查找到具体的对应关系,如果没有的话,就会在ZK中进行查找到对应 Region server,然后再转发到具体的 Region 上。所有的数据在写入的时候先是记录在 WAL 中,同时检查关于 MemStore 是否满了,如果是满了,那么就会进行刷盘,输出到一个 Hfile 中,如果没有满的话,那么就是先写进 Memstore 中,然后再刷到 WAL 中。