Hbase存储原理
金蝶云社区-艾贺521
艾贺521
53人赞赏了该文章 2473次浏览 未经作者许可,禁止转载编辑于2018年12月10日 11:23:29
封面

Hbase本身是数据库,本身就是为了存储数据,因此了解其存储原理对我们是很有必要的,这样我们才能更好的使用Hbase。


这篇文章主要记录了关于Hbase一些进阶的知识点,掌握这些东西在以后使用Hbase的过程中将更加的得心应手。


行式存储与列式存储

列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的。简单来说两者的区别就是如何组织表

- 行式存储以一系列的行来存储一个表,一行一行的进行存储

- 列式存储以一系列的列来存储一个表, 一个列一个列的进行存储


image.png


image.png

image.png


行式存储与列式存储的应用环境

如果需要关系查询,那么行式存储很好

行式存储最大的优点是关系之间的解决方案,表与表之间很大的关联关系并且数据量不大,那么行式存储就是很好的选择。记住因为它的线性扩展性不高,需要保证数据量不能特别大,控制在千万级与以下。

如果数据量非常大,使用列式存储

在大数据,利于压缩和扩展的肯定要选择列式存储,如果事务使用率不高,那么也最好使用列式存储,随机更新更些行的频率不高,也可以使用列式存储


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进行字典排序。

image.png

这张图可以看到其存储排序是先由rowkey排序,然后按列的名称进行排序

image.png


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提供了三种常用的压缩类型,如下,并且官方给出的压缩率如下:

image.png

Hbase数据存储目录解析

我们在搭建Hbase的时候需要在hbase-site.xml中指定其存储目录,Hbase在指定的目录中构造数据数据

image.png

image.png

- .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"表了,如果缓存过期之后,客户端会发起一个新的查询,然后再缓存到本地。

image.png


在读取的时候,其中的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)


注:

本文独家发布自金蝶云社区


赞 53