一、HBase的存储模式
1.行式存储与列式存储介绍

列簇式存储:概念
- 列簇(多个数据列的组合),HBase表中的每个列都归属于某个列簇
- 列簇是表的schame的一部分,但是列并不是
- 创建表时,需要给出列簇的名称,不需要给出列的名称
- 列名都是以列簇作为前缀
- 访问控制磁盘和内存的使用统计都是在列簇层面进行
- HBase准确的说是列簇数据库,而不是列数据库
- 列簇数据库将列组织为列簇,每列都必须是某个列簇的一部分
- 访问数据的单元也是列
作者:喵手空空
2.行式存储与列式存储各自的特点
行式存储
维护大量的索引;
存储成本高
不能够做到线性扩展
随机读取效率非常高
对事务的支持非常好
列式存储
根据同一列数据的相似性原理,利于对数据进行压缩
存储成本低
由于每列数据分开存储,可以并行查找多列的数据
3.行式存储与列式存储场景
行式存储
表与表之间有关联关系,数据量不大(小于千万量级)
强事务关联的特性
列式存储
对于单列或者相对比较少的列获取频率较高
针对多列查询,使用并行处理的查询
利于数据压缩和线性扩展的存储
事务使用率不高,读取的场景频率不高,同时数据量非常大
随机更新某一行的频率不高
4.HBase的列族式存储
列族式存储概念
列簇(多个数据列的组合),HBase表中的每个列都归属于某个列簇
列簇是表的schame的一部分,但是列并不是
创建表时,需要给出列簇的名称,不需要给出列的名称
列名都是以列簇作为前缀
访问控制磁盘和内存的使用统计都是在列簇层面进行
准确的说是列簇数据库,而不是列数据库
列簇数据库将列组织为列簇,每列都必须是某个列簇的一部分
访问数据的单元也是列
HBase表的组成

:HBase中用RowKey去标识唯一的一行数据,一行数据中包含多个列簇
:多个列簇。每一列簇包含多个列
:列标识符。每一列数据包含了版本和值
:版本。可以理解为时间戳,也可以理解为一个数据的版本
:数据值。数据本身的值
数据存储模式

其实就是HBase表反过来看的样子
更抽象一点,其实HBase表数据就是Key-Value结构的
HBase表的组成
- Table = RowKey + Family + Column + Timestamp + Value
- RowKey :HBase中用RowKey去标识唯一的一行数据,一行数据中包含多个列簇
- Family:多个列簇。每一列簇包含多个列
- Column:列标识符。每一列数据包含了版本和值
- Timestamp:版本。可以理解为时间戳,也可以理解为一个数据的版本
- Value:数据值。数据本身的值
作者:喵手空空
图解

HBase表的组成
- Table = RowKey + Family + Column + Timestamp + Value
- RowKey :HBase中用RowKey去标识唯一的一行数据,一行数据中包含多个列簇
- Family:多个列簇。每一列簇包含多个列
- Column:列标识符。每一列数据包含了版本和值
- Timestamp:版本。可以理解为时间戳,也可以理解为一个数据的版本
- Value:数据值。数据本身的值
作者:喵手空空
列数据属性

数据存储原型

存储示例

二、HBase数据表解析
建表语句解析

关键字说明

压缩算法

数据存储目录解析
在hbase-site.xml文件中配置或查看存储目录的节点
<property>
<name>hbase.rootdir</name>
<value>/home/hbase_data</value>
</property>
进入到HBase系统目录
- temp
当对表做创建或删除操作时,将表移动到tmp目录下,然后再进行处理
临时交换的表,临时存储一些当前需要修改的数据结构
- WALs
预写日志,被HLog实例管理的WAL文件
可以理解为存储HBase的日志,HBase分布式数据库系统的操作日志
- archive
存储表的归档和快照
在做分割或合并操作完成后,会将Hfile文件移动到该目录中,然后将之前的Hfile删除掉
是由Master上的定时任务定期去处理,这个目录的作用可以简单理解为去管理HBase的数据
- corrupt
用于存放损坏的日志文件,一般是空的
- data
存储数据的核心目录
系统表和用户表数据都存储在这里
- hbase.id
启动运行后,是集群中的唯一ID,用来标识HBase进程用的
- hbase.version
表明了集群的文件格式版本信息
其实就是表明了Hfile的版本信息
- oldWALs
备份WALs中的日志文件
data目录解析

元信息表

三、HBase存储设计
中的LSM存储思想
(1)LSM树概念
LSM日志结构合并树,有两个或两个以上存储数据的结构组成的,每一个数据结构各自对应自己的存储介质
树的简易模型

思想在HBase中的实现

数据存储模块简介
RegionServer = Region + Store + MemStore + StoreFile + HFile + HLog

解析
什么是Region
每一个Region都会存储于确定的RegionServer上

特点
- 是HBase中分布式存储和负载均衡的最小单元
- Region的数据不能低于集群中节点的数量
- RegionServer对Region进行拆分
- 尽量让Row key分散到不同的Region
解析
Store + MemStore + StoreFile
- Store与列簇是一对一的关系
- MemStore是一个内存数据结构,保存修改的数据
- StoreFile是由内存数据写入到文件后形成的

HFile 文件
- 是HBase存储数据文件的最基本的组织形式
- 底层是Hadoop的二进制格式文件
- 是用户数据的实际载体,存储Key-Value的数据
- Scanned block section:会被读取,主要是存储用户数据
- Nonscanned block section:不会被读取,主要包含元数据块
- Load-on-open section:RegionServer启动时加载,主要是HFile的元数据
- Trailer:HFile的基本信息,HFile元数据的一部分

Data Block
- HBase中数据的最基本的存储单元
- 是实际存储用户数据的数据结构
- 包含很多Key-Value

解析
介绍(预写日志)
- WAL最重要的功能就是灾难恢复
- WAL解决了什么问题:HA(高可用)问题
- 解决:远程备份

(2)HLog
- WAL是通过HLog模块实现的
- HLog是什么:HLog是实现WAL的类,一个RegionServer对应一个HLog实例

(3)HLogKey
WAL使用Hadoop的序列化文件将记录存储为Key-Value的数据集,Key就是HLog的Key

(日志同步刷写类)

(5)HLogRoller
- 特点的时间去滚动日志,形成新的日志,避免单个日志文件过大
- 根据HLog的序列化的number对比已经持久化的HFile的序列号,删除旧的,不需要的日志

解析
介绍
Compaction会从一个Region的Store中选择一些HFile文件进行合并
作业
随着系统不停的刷写,会导致存储目录中有过多的数据文件
分类
- MinorCompaction:小合并
- MajorCompaction:大合并

的触发时机
MemStore 内存数据写入到硬盘上

四、Hbase数据存取解析
数据存取流程解析
数据存储
客户端:HBase Client
- 请求Zookeeper,确定 MetaTable所在RegionServer的地址
- 在根据RowKey找到归属的RegionServer
- HBase Client Put(Delete)数据,提交到RegionServer

服务器:HBase Server
- Region Server 去获取行锁,Region更新共享锁
- 写HLog,WAL
- 写缓存,MemStore
- 将日志同步到HDFS
- 写满缓存后,启动异步线程将数据写入到硬盘上
- 可能触发Compaction或拆分

数据获取
客户端:HBase Client
- 请求Zookeeper,确定 MetaTable所在RegionServer的地址
- 去对应的RegionServer地址拿到对应数据

服务端:HBase Server
- Region Server 构建RegionScanner准备进行检索
- 有多少个列簇就构建多少个StoreScanner,用于对确定的列簇数据检索

数据存取优化
存储优化
检索(获取)优化


数据存取api介绍
存储数据api介绍

















