一文说清HBase的存储结构

2019-06-04 18:12:44 浏览数 (1)

本文经授权转载于 spacedong

公号ID dd_technology

阅读文本大概需要 7 分钟。

前言

HBase 是一个分布式的、多版本、面向列的开源 KV 数据库。运行在 HDFS 的基础上,支持 PB 级别、百万列的数据存储。

作为性能如此强大的 KV数据库,HBase 的存储结构究竟是怎样的呢?面向列的存储结构究竟有什么样的不同之处呢?接下来会详细讲解这部分。

HBase的存储结构

为了清晰地表述这个,我们把 HBase 的存储结构分为逻辑结构和物理结构两个部分。

逻辑存储结构

通过下图直观地展示 HBase 的逻辑存储结构:

HBase 逻辑视图

在本图中,列簇(Column Family)对应的值就是 infoarea ,列(Column 或者称为 Qualifier)对应的就是 nameagecountrycityRow key 对应的就是 Row 1Row 2Cell 对应的就是具体的值。

  • Row key :表的主键,按照字典序排序。
  • 列簇:在 HBase 中,列簇将表进行横向切割。
  • 列:属于某一个列簇,在 HBase 中可以进行动态的添加。
  • Cell : 是指具体的 Value
  • Version :在这张图里面没有显示出来,这个是指版本号,用时间戳(TimeStamp )来表示。

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

Key 和 Value 图

KEY 的组成是以 Row keyCF(Column Family)ColumnTimeStamp 组成的。

TimeStampHBase 中充当的作用就是版本号,因为在 HBase 中有着数据多版本的特性,所以同一个 KEY 可以有多个版本的 Value 值(可以通过配置来设置多少个版本)。

查询的话是默认取回最新版本的那条数据,但是也可以进行查询多个版本号的数据,在接下来的进阶操作文章中会有演示。

Region Server 和 Region 的关系

Region Server 和 Region 关系图

  • 一个 Region Server 就是一个机器节点(服务器)
  • 一个 Region Server 包含着多个 Region
  • 一个 Region 包含着多个列簇 (CF)
  • 一个 Region Server 中可以有多张 Table,一张 Table 可以有多个 Region
物理存储结构

先来看这张图:

Hbase架构图

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

逻辑结构

物理结构

Region Server

HRegion Server

Region

HRegion

CF

HStore(这里指的是Store)

在具体的物理结构中

  • HRegion Server 就是一个机器节点,包含多个 HRegion ,但是这些 HRegion 不一定是来自于同一个 Table ,负责响应的是用户的 IO 请求,和 HDFS 进行交互,是服务器中的一个进程。
  • HRegion 包含多个 HStore
  • 一个 CF 组成一个 HStore ,默认是 10 G,如果大于 10G 会进行分裂。HStoreHBase 的核心存储单元,一个 HStoreMemStoreStoreFile 组成。
  • MemStore 是一块内存,默认大小是 128M,如果超过了这个大小,那么就会进行刷盘,把内存里的数据刷进到 StoreFile 中。
  • HStore 对应着的是 Table 里面的 Column Family,不管有 CF 中有多少的数据,都会存储在 HStore 中,为了避免访问不同的 HStore 而导致的效率低下。
  • HRegionHbase 中分布式存储和负载均衡的最小单元,但不是存储的最小单元。
  • 一个 Hstore 可以有多个 StoreFile
在HBase中查找不同的CF的数据

从不同的 CF 中查询 Row 3 主键的数据,结果集如下:

查找Row 3的数据

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

HBase的架构

如下图,HBase 的架构图,在 HBase 中我们看到有 ClientZookeeperHMasterHRegion

HBase的架构图

  • Client 是客户端,要求读写数据的发起者。
  • ZK 集群是负责转发 Client 的请求和提供心跳机制,会让 HRegion ServerHRegion 注册进来,同时保存着 RowkeyRegion 的映射关系。
  • HMaster 中可以有多个待命,只有一个在活跃。
Hbase读取数据的过程

Client 请求读取数据时,先转发到 ZK 集群,在 ZK 集群中寻找到相对应的 Region Server,再找到对应的 Region,先是查 MemStore,如果在 MemStore 中获取到数据,那么就会直接返回,否则就是再由 Region 找到对应的 Store File,从而查到具体的数据。

在整个架构中,HMasterHRegion Server 可以是同一个节点上,可以有多个 HMaster 存在,但是只有一个 HMaster 在活跃。

Client 端会进行 rowkey-> HRegion 映射关系的缓存,降低下次寻址的压力。

HBase 写入数据的过程

在HBase中写入数据的过程

先是 Client 进行发起数据的插入请求,如果 Client 本身存储了关于 RowkeyRegion 的映射关系的话,那么就会先查找到具体的对应关系,如果没有的话,就会在ZK中进行查找到对应 Region server,然后再转发到具体的 Region 上。

所有的数据在写入的时候先是记录在 WAL 中,同时检查关于 MemStore 是否满了,如果是满了,那么就会进行刷盘,输出到一个 Hfile 中,如果没有满的话,那么就是先写进 Memstore 中,然后再刷到 WAL 中。

福利

看完后,是否对 HBase 的存储结构有所了解了呢?最后送两本电子书给大家,一本是《HBase权威指南(中文版)高清完整版》,一本是《HBase实战中文版》,在公众号后台回复 HBase 关键字即可获取。

题图:chichimaru

PS:画图的过程是真滴累啊!!!

0 人点赞