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 数据模型是稀疏结构的数据,数据存储模型如下图所示:
如上图所示,以关系型数据的思维会感觉这是一张表,但是在 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