本文讨论了Hbase的存储原理与进阶知识,包括行式与列式存储的区别及其适用环境。Hbase采用列族式存储,创表时需指定列族。数据存储以(Table, rowkey, family, column, timestamp)为索引,支持多版本数据保存。Hbase的存储架构稀疏、分布式、持久,通过两个SortedMap实现排序。文中还分析了Hbase的表结构与数据存储目录,并介绍了元数据表hbase:meta的作用与读取数据的流程,包括WAL的作用与HFile的数据存储机制。
Hbase本身是数据库,本身就是为了存储数据,因此了解其存储原理对我们是很有必要的,这样我们才能更好的使用Hbase。
这篇文章主要记录了关于Hbase一些进阶的知识点,掌握这些东西在以后使用Hbase的过程中将更加的得心应手。
行式存储与列式存储
列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的。简单来说两者的区别就是如何组织表
- 行式存储以一系列的行来存储一个表,一行一行的进行存储
- 列式存储以一系列的列来存储一个表, 一个列一个列的进行存储
行式存储与列式存储的应用环境
如果需要关系查询,那么行式存储很好
行式存储最大的优点是关系之间的解决方案,表与表之间很大的关联关系并且数据量不大,那么行式存储就是很好的选择。记住因为它的线性扩展性不高,需要保证数据量不能特别大,控制在千万级与以下。
如果数据量非常大,使用列式存储
在大数据,利于压缩和扩展的肯定要选择列式存储,如果事务使用率不高,那么也最好使用列式存储,随机更新更些行的频率不高,也可以使用列式存储
Hbase的列族式存储
列族就是多个数据列的组合,列族式可以说是表的schema的一部分,而列不是。Hbase可以说是列簇数据库,在创建表的时候要指定列族,而不需要指定具体的列。
Hbase Table组成:
Table = rowkey + family + column + timestamp + value
数据存储模式:
(Table, rowkey , family , column , timestamp) -> Value
Hbase列数据默认可以保存3个版本,不过可以设置该属于保存几个版本。
Hbase数据存储原型
HBase 是一个稀疏的、分布式、持久、多维、排序的映射,它以行键(row key),列键(column key)和时间戳(timestamp)为索引。
Hbase在存储数据的时候,有两个SortedMap,首先按照rowkey进行字典排序,然后再对Column进行字典排序。
这张图可以看到其存储排序是先由rowkey排序,然后按列的名称进行排序
Hbase数据表解析
我们分析下条语句,在hbase shell中,直接按create命令不带参数,hbase会提示建表的语法。
create 'demo:user', {NAME => 'f1', VERSIONS => 5, COMPRESSION => 'SNAPPY',COMPRESSION_COMPACT=>'snappy','REPLICATION_SCOPE'=>1}
- 表名字叫做'demo:user'
- NAME 列族名字是 f1,记住建表一定要指定列族名
- VERSION 是Hbase的表保存的数据版本数,默认保存3个版本
- REPLICATION_SCOPE 值可以为0或者1,0代表不复制,1代表启用复制
- COMPRESSION_COMPACT,COMPRESSION 是表的压缩类型
Hbase提供了三种常用的压缩类型,如下,并且官方给出的压缩率如下:
Hbase数据存储目录解析
我们在搭建Hbase的时候需要在hbase-site.xml中指定其存储目录,Hbase在指定的目录中构造数据数据
- .tmp 当对表进行创建和删除的时候会把表移动到.tmp目录下,然后再进行表操作,他是一个临时的数据交换目录
- WALS 理解为存储Hbase的操作日志
- archive 管理表的归档,这个由一个定时任务定时处理,管理和维护hbase的数据
- corrupt 一般是损坏的数据
- data 存储数据的核心目录
- hbase.id 标识hbase进程
- hbase.version 表名的
- oldWALs 日志已经被持久化之后,日志就被移动到这个目录下等待删除
- data/default 目录存储的是当前Hbase内包含的的表信息
- data/hbase 存储元数据和命名空间
Hbase的元信息表
hbase的元数据表为'hbase:meta',存储在ZooKeeper上面。它也是一张普通的hbase表。它的结构如下:
region是存储数据的最基本单元
Key:
table,key,time 三个部分的组合。因为Hbase根据rowkey排序,所有可用很快的找打对应的表
Values: 指向的是region server指向的region
info:regioninfo 对于region的基本信息存储,平时基本上用不到
info:server region服务器的地址和端口,这样就可以找到服务器
info:serverstartcode 数据校验的时候才用得到的
里面的值也是会进行变化的。RegionServer挂掉,它也会及时的更新,Hbase表相当于Hbase的第一级索引,是Hbase最重要的系统表。
Hbase读取数据过程
在读数据的时候,客户端首先连接到ZooKeeper上面,然后查找"hbase:meta"表的位置,客户端查询"hbase:meta"表然后找到对应rowKey的Region,然后Region和RegionServer的信息缓存到客户端,在接下来的交互中就无需再次连接查询"hbase:meta"表了,如果缓存过期之后,客户端会发起一个新的查询,然后再缓存到本地。
在读取的时候,其中的WAL功能如下:
在写数据的时候,数据首先被写到日志文件中(write-ahead log),然后写到MemStore中。直接写到MemStore很有可能导致数据丢失的问题,因为它存储在内容中。一旦MemStore满了,MemStore的内容就会刷新到磁盘中的HFile文件中。
在发生故障的时候,WAL的作用就显示出来了。因为WAL存储在HDFS上面,一般会有多份的复制,任何一个服务器有复制的WAL都可以使用。
而HFile代表真实的数据存储文件,这个文件包含不同数量的数据块和固定数量的文件信息块。索引块记录数据和元数据块的偏移量,每一个数据块包含魔数头和许多的KeyValue实例。
参考
[Hbase .META table](https://stackoverflow.com/questions/25917701/hbase-meta-table)
[Hbase 官方参考](http://hbase.apache.org/book.html#arch.catalog.meta)
[Hbase 存储原理剖析](https://www.imooc.com/learn/996)
[几张图看懂列式存储](https://blog.csdn.net/dc_726/article/details/41143175)
[Hbase模式设计介绍](https://zhuanlan.zhihu.com/p/36235199)
[Hbase存储原理剖析](https://www.imooc.com/learn/996)
注:
本文独家发布自金蝶云社区