HBase 学习第 3 天:HBase 数据模型及架构详解

一、HBase 数据库是什么

  • HBase 是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库
  • HBase 是一个利用 HDFS 来存储数据、利用 MapReduce 来处理数据、利用 Zookeeper 作为其分布式协同服务
  • HBase 主要用于存储非结构化和半结构化的松散数据—NoSql 数据库
  • HBase 的数据读写是将数据作标记,删除数据时并不是将数据直接在磁盘中删除,读取的时候是看标记

二、HBase 从哪里来

HBase 是来源于 Fay Chang 所撰写的 Google 论文 “Bigtable :

一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(FileSystem)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase 是 Apache 的 Hadoop 项目的子项目。HBase不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库。

三、HBase 数据模型

HBase 数据模型是稀疏结构的数据,数据存储模型如下图所示:
2324243

如上图所示,以关系型数据的思维会感觉这是一张表,但是在 HBase 中这种理解是错误的,在 HBase 中上面的表格显示的只是一行数据;其中各单元格标题描述如下所示

1、RowKey

(1)决定一行数据的唯一标识

(2) RowKey 是按照字典顺序排序的

(3)RowKey 最多只能存储64k的字节数据,RowKey 设计越短越好

(4)Column Family列族(CF1、CF2、CF3) & qualifier列:

  • HBase表中的每个列都归属于某个列族,列族必须作为表模式(schema) 定义的一部分预先给出。如create ‘test’, ‘info’;
  • 列名以列族作为前缀,每个“列族”都可以有多个列成员(column,每个列族中可以存放几千~上千万个列);如 CF1:q1, CF2:qw,
  • 新的列族成员(列)可以随后按需、动态加入,Family下面可以有多个 Qualifier,所以可以简单的理解为,HBase中的列是二级列,也就是说 Family 是第一级列,Qualifier 是第二级列。两个是父子关系
  • 权限控制、存储以及调优都是在列族层面进行的
  • HBase把同一列族里面的数据存储在同一目录下,由几个文件保存
  • 目前为止 HBase 的列族能够很好处理最多不超过3个列族

2、时间戳(Timestamp)

(1)在 HBase 每个 cell
存储单元对同一份数据可以有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。

(2)时间戳的类型是 64 位整型,一般由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。

时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。

3、列族(Column Family)

(1)HBase表中的每个列都归属于某个列族,列族必须作为表模式(schema)定义的一部分预先给出。如 create ‘tb’, ‘f’;

列名以列族作为前缀,每个“列族”都可以有多个列(column);如f:a, f:b, 新的列族成员(列)可以随后按需、动态加入;

(2)权限控制、存储以及调优都是在列族层面进行的;

(3)HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。

4、单元格(cell-细胞)

(1)cell(一个细胞) 由行和列的座标交叉决定

(2)单元格是有版本的;

(3)cell的内容是未解析的字节数组;

(4)cell 是由 {row key, column( = +), version} 唯一确定的单元。

(5)cell 中的数据是无类型数据,全部以字节码形式存储。

三、Hbase 特点

1、海量存储:提供海量数据的存储

2、列式存储:列族存储,列族在创建表的时候必须指定,而且是唯一的,列族代表一个hbase 表中的家族,

3、极易扩展:

  • HBase 存储扩展性–指的是扩展 HDFS 存储性能

  • HBase 处理扩展性–业务能力(基于 Reginserver的扩展)

4、高并发性质

单机 io 延迟率低,查询数据响应快

5、稀疏性

Hbase 表中的数据是列稀疏的,结构性数据库中的表中数据不能为空,即使为空也是null标记
hbase 中的列是稀疏的,列中的数据无就是空的,实实在在,有就有,无就无

四、HBase 架构设计

HBase 底层核心架构设计如下:
在这里插入图片描述

五、HBase 角色介绍

1、Client

  • 包含访问HBase的接口并维护 cache 来加快对 HBase 的访问

2、Zookeeper

  • 保证任何时候,集群中只有一个master
  • 存贮所有 Region 的寻址入口。
  • 实时监控 RegionServer 的上线和下线信息。并实时通知 Master
  • 存储 HBase 的 schema 和 table 元数据信息

3、HMaster

  • 为 RegionServer 分配 Region
  • 负责 RegionServer 的负载均衡
  • 发现失效的 Region, HMaster 会重新分配到其他正常的 HRegionServer 上
  • 管理用户对 table 的增删改操作

4、HRegionServer

  • HRegionServer 对接用户的读写请求,是‘干活’节点;
    管理 Master 分配的 Region
  • HRegionServer 维护 Region,处理对这些 Region 的 IO 请求
  • HRegionServer 负责切分在运行过程中变得过大的 Region 
    在这里插入图片描述

5、HLog(WAL log):

  • HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和 region名字外,同时还包括sequence number和timestamp,timestamp是” 写入时间”,sequence number的起始值为0,
    或者是最近一次存入文件系 统中sequence number。
  • HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的 KeyValue

6、Region

  • HBase自动把表水平划分成多个区域(region),每个 region 会保存一个表 里面某段连续的数据;每个表一开始只有一个region,随着数据不断插 入表,region不断增大,当增大到一个阀值的时候,region就会等分会 两个新的region(裂变);
  • 当table中的行不断增多,就会有越来越多的 region。这样一张完整的表 被保存在多个Regionserver上。
  • 当Table随着记录数不断增加而变大后,会逐渐分裂成多份 splits,成为 regions,一个 region 由[startkey,endkey)表示,不同的 region 会被 Master 分配给相应的 RegionServer 进行管理,split 流程如下:
    在这里插入图片描述

7、Memstore 与 storefile

HBase 的存储核心是由MemStore和StoreFile组成,MemStore 是Sorted Memory Buffer。用户写入数据的流程,如下所示:
在这里插入图片描述

  • 一个region由多个 store 组成,一个store对应一个CF(列族)
  • store 包括位于内存中的memstore和位于磁盘的storefile写操作先写入 memstore,当memstore中的数据达到某个阈值,hregionserver会启动 flashcache进程写入storefile,每次写入形成单独的一个storefile
  • 当 storefile 文件的数量增长到一定阈值后,系统会进行合并(minor、 major compaction),在合并过程中会进行版本合并和删除工作 (majar),形成更大的 storefile。
  • 当一个region所有storefile的大小和超过一定阈值后,会把当前的region 分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡。
  • 客户端检索数据,先在 memstore 找,找不到再找 storefile
  • HRegion 是 HBase 中分布式存储和负载均衡的最小单元。最小单元就表 示不同的 HRegion 可以分布在不同的HRegion server上。
  • HRegion 由一个或者多个 Store 组成,每个 store 保存一个columns family。
  • 每个 Strore 又由一个 memStore 和 0 至多个 StoreFile 组成。

8、HFile

如图:StoreFile 以 HFile 格式保存在HDFS上,HFile 格式如下所示:     
在这里插入图片描述
图文解释:

  • HFile文件不定长,长度固定的块只有两个:Trailer 和 FileInfo
  • Trailer中指针指向其他数据块的起始点
  • File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等
  • Data Index和Meta Index块记录了每个Data块和Meta块的起始点
  • Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制
  • 每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询
  • 每个 Data 块除了开头的 Magic 以外就是一个个 KeyValue 对拼接而成, Magic 内容就是一些随机数字,目的是防止数据损坏
  • HFile里面的每个 KeyValue 对就是一个简单的 byte 数组。这个byte数组里面包含了很多项,并且有固定的结构。
    在这里插入图片描述
  • KeyLength 和 ValueLength:两个固定的长度,分别代表 Key 和 Value 的长度
  • Key 部分:Row Length 是固定长度的数值,表示 RowKey 的长度,Row 就是 RowKey
  • Column Family Length 是固定长度的数值,表示 Family 的长度
  • 接着就是 Column Family,再接着是 Qualifier,然后是两个固定长度的数值,表示 Time Stamp 和 Key Type(Put/Delete)
  • Value 是纯粹的二进制数据

9、HLog File

在这里插入图片描述

  • HLog文件是一个普通的 Hadoop Sequence File,Sequence File 的 Key 是 HLogKey 对象,HLogKey 中记录了写入数据的归属信息,除了 table 和 region 名字外,同时还包括 sequence number 和 timestamp,timestamp 是“写入时间”,sequence number 的起始值为 0,或者是最近一次存入文件系统中 sequence number。
  • HLog Sequece File 的 Value 是 HBase 的 KeyValue 对象,即对应 HFile 中的 KeyValue

总结

本文是对 HBase 数据模型和架构进行详解,因为在工作中使用到 HBase 数据库,所以将 HBase 知识点作详细记录,方便以后使用时查阅。

参考

https://www.cnblogs.com/cenyuhai/p/3708135.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章