1. HBase 定义
HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。
2. HBase 数据模型的定义
-
Name Space
命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。 HBase有两个自带的命名空间,分别是 hbase 和 default, hbase 中存放的是 HBase 内置的表(meta等),default 表是用户默认使用的命名空间。 -
Region
类似于关系型数据库的表概念。不同的是, HBase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着, 往 HBase 写入数据时,字段可以动态、 按需指定。因此,和关系型数据库相比, HBase 能够轻松应对字段变更的场景(默认当数据大于10g时候开始切分数据为一个Region)
HBase 表会根据 RowKey 值被切分成不同的 region 存储在 RegionServer中,在一个 RegionServer 中可以有多个不同的 region。同一个行键的 Region 不会被拆分到多个 Region 服务器上。 一个HBase表被划分成多个Region,开始只有一个Region,后台不断分裂。
-
Row
HBase 表中的每行数据都由一个 RowKey (行键)和多个 Column(列)组成,数据是按照 RowKey的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索,所以 RowKey 的设计十分重要 -
Column
HBase 中的每个列都由 Column Family(列族) 和 Column Qualifier(列限定符) 进行限定,例如 info: name, info: age。建表时,只需指明列族,而列限定符无需预先定义。 -
Time Stamp
用于标识数据的不同版本(version), 每条数据写入时, 如果不指定时间戳, 系统会自动为其加上该字段,其值为写入 HBase 的时间(客户端操作系统时间需要和linux系统时间保持一致,否则会出现很多麻烦的问题)。
时间戳工具网站 -
Cell
实际存储数据的地方,由{rowkey, column Family: column Qualifier, time Stamp} 唯一确定的单元。 cell 中的数据是没有类型的,全部是字节码形式存贮。
3. HBase 逻辑结构
HBase表由行和列组成,每个行由行键(row key)来标识,列划分为若干列族,一个列族中可以包含任意多个列,同一个列族里面的数据存储在一个文件中。当这个文件达到一定大小后,会进行分裂形成多个region。当一个行键在不同的列族中都有相应的列值的话,不同列族中的文件都会存储这个行键的值。
总的来说,一行可能包含多个列族,一个列族有多个列,对某一行而言,某列族文件中只存储了这一行键在列族中有值的那些列(列族可能有上百个列),没有不会存储(不存null)。
下图为一个Name Space 的逻辑结构
- 列 :相当于mysql的字段。建表时,只需指明列族,而列限定符无需预先定义。字段可以动态、 按需指定。
- 列族 :建表时需指定,其中的列可以动态扩展,列族存在于linux系统的不同文件夹下(一个列族可以视为一个文件夹)
- Row key :行键。数据是按照 RowKey的字典顺序存储的,并且查询数据时需要根据 RowKey 进行检索。
- Region :类似于关系型数据库的表概念(默认当数据大于10g时候开始切分数据为一个Region)。
- Store :数据实际存储的地方(其实是图中不包含Row key列的深绿色区域)
4. HBase 物理存储结构
当在t4时间put(插入)row_key1的phone数据时,原来t3的并不会马上被覆盖。当查询row_key1的phone时会返回时间戳最大的t4那一个数据(最新的)。
5. HBase 系统架构
Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等几个组件组成,HBase依赖于ZooKeeper和HDFS。
-
Zookeeper :HBase 通过 Zookeeper 来做 master 的高可用(通过 Zoopkeeper 来保证集群中只有 1 个 master 在运行,如果 master 异常,会通过竞争机制产生新的 master 提供服务。)、RegionServer 的监控(通过 Zoopkeeper 来监控 RegionServer 的状态,当 RegionSevrer 有异常的时候,通过回调的形式通知 Master RegionServer 上下线的信息)、元数据的入口以及集群配置的维护等工作。
-
Region Server :Region Server 为 Region 的管理者, 其实现类为 HRegionServer,主要作用如下:
对于数据的操作: get, put, delete;
对于 Region 的操作: splitRegion、 compactRegion。
功能概括如下: 管理 master 为其分配的 Region,处理来自客户端的读写请求 ,负责和底层 HDFS 的交互(存储数据到 HDFS),负责 Region 变大以后的拆分,负责 Storefile 的合并工作 ,刷新缓存到HDFS,维护Hlog -
master :Master 是所有 Region Server 的管理者,其实现类为 HMaster,主要作用如下:
对于表的操作: create, delete, alter;
对于 RegionServer的操作:监控 RegionServer,为 RegionServer 分配 Region(维护整个集群的负载均衡,在空闲时间进行数据的负载均衡 ) ,维护集群的元数据信息,处理 region 的分配或转移(发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer 上 ;当 RegionSever 失效的时候,协调对应 Hlog 的拆分) -
HDFS :HDFS 为 HBase 提供最终的底层数据存储服务,同时为 HBase 提供高可用(Hlog 存储在HDFS)的支持。
功能概括如下:提供元数据和表数据的底层分布式存储服务,保证的高可靠和高可用性 (数据多副本) -
MemStore :内存缓存,达到一定缓存大小或者时间节点触发一次 flush,文件系统中生成新的 HFile,每次 Flush 的最小单位是 Region。每个 列族(Column family)维护一个 MemStore。
MemStore介绍 -
Write-Ahead logs(又名WAL,Hlog) :当对 HBase 写数据的时候,数据会在内存MemStore中保留一段时间,MemStore达到一定的数据量(时间以及数据量阈值可以设定),数据再写进磁盘。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中,所以在系统出现故障的时候,数据可以通过这个日志文件重建。
HBase WAL简介
HFile与HLog结构解析 -
Store :HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。
-
HFile :这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile 是以 Hfile的形式存储在 HDFS 的。
-
Meta表(元数据表) :描述HBase表的表。有了 Region 标识符,就可以唯一标识每个 Region。为了定位每个 Region 所在的位置,可以构建一张映射表。映射表的每个条目包含两项内容,一项是 Region 标识符,另一项是 Region 服务器标识。这个条目就表示 Region 和 Region 服务器之间的对应关系,从而就可以使用户知道某个 Region 存储在哪个 Region 服务器中。这个映射表包含了关于 Region 的元数据,因此也被称为“元数据表”,又名“Meta表”。
6. HBase读写流程
文中资料链接: 尚硅谷HBase教程(hbase框架快速入门);
参考博客:HBase简介;