关于hbase:HBase-数据存储结构详细解读

3次阅读

共计 2164 个字符,预计需要花费 6 分钟才能阅读完成。

在「HBase」中, 从逻辑上来讲数据大略就长这样:

单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是:

将不同的列归属与同一个列族下
反对多版本数据
这看着感觉也没有那么太大的区别呀, 它解决了 MySQL 的那些问题呢? 每一个新事物的呈现, 都是为了解决本来存在的问题.

对写入敌对, 反对异步大批量并发写入
可动静增加列
按列存储数据, 不存在的列不会落盘, 节俭空间. 而 MySQL 中不存在的内容也要用 null 填充
反对海量数据分布式存储 (BigTable 最开始就是 Google 为了解决数据存储问题而提出来的)
等等
那么他是如何解决这些问题的呢? 他的数据是如何进行存储的呢?

HBase 数据物理构造
在介绍其物理构造之前, 要先简略提一下 LSM 树

LSM 树
和 MySQL 所应用的 B + 树一样, 也是一种磁盘数据的索引构造. B+ 树是一种对读取敌对的存储构造, 然而当大量写入的时候, 比方日志信息, 因为波及到随机写入, 就显得顾此失彼了.

而「LSM 树」就是针对这种大量写入的场景而提出的. 他的中文名字叫: 日志构造合并树. 文件存储的是对数据的批改操作, 数据会 append 但不会去批改原有的数据. 是程序写入操作.

然而, 如果不管不顾的将所有的操作都程序写入了, 大数据培训那读取数据的时候没有任何依据, 须要扫描所有操作能力读到.「LSM 树」的做法是, 先在内存中保护一份小的有序的数据(内存不存在随机读写的问题), 当这份数据超过肯定大小的时候, 将其整个放入磁盘中.

这样, 磁盘中就存在很多个有序的文件了, 然而会有大量的小文件, 读取数据时要顺次查找, 导致读取性能升高. 这时就须要对多个小文件进行多路归并合成一个文件来优化读取的性能.

至此, 根本就是「LSM 树」的全副思维了.

在内存中保护一个有序的数据
将内存中的数据 push 到磁盘中
将磁盘中的多个有序文件进行归并, 合成一个较大的有序文件
HBase 存储
在「HBase」中, 数据的存储就应用了「LSM 树」进行存储. 其中每一条数据都是一条操作记录. 那么在「HBase」实现中的局部内容如下.

「内存有序构造的实现」

通过跳表来保护内存中的有序构造, 当一个跳表装满之后, 将禁止新的写入操作并将其 push 到磁盘中, 同时开一个新的数据结构来接管新到的操作申请.

「每条数据的存储内容」

存储了一个 KV 键值对, 其中的 V 就是咱们写入的值, 而这个 key 由以下局部组成:

row key
列族
列名
工夫戳
操作类型: Put、Delete、DeleteColumn、DeleteFamily 等等
整个列表是 key 的程序列表. 其排序规定如下:

row key 小的排在后面
同 row key 比拟列族
同列族比拟列名
同列名比拟工夫戳, 工夫戳大的在后面.
依照这个程序进行读取指定 row key 的某一列数据时, 最先拿到的数据就是最新的版本, 若是 delete 操作, 阐明最初执行了删除操作, 即便前面有数据, 最新数据也是空.

「磁盘文件的构造」

由三局部组成:

头信息: 存储文件大小, 文件块数量, 索引地位, 索引大小等信息
索引数据: 用户对文件中所有数据块进行索引, 其中每一个数据块都蕴含一条索引数据, 索引内容包含
数据块的最初一条数据. 用于对索引进行二分查找, 疾速定位到指定的数据块
数据块在文件中的地位
数据块的大小
布隆过滤器. 用户在扫描时疾速过滤不存在的数据块
数据块. 其中存储了每一条 KV 数据.
依照这个构造, 上海大数据培训用户在进行指定 row_key 读取的时候, 每个文件的操作如下:

依据头信息内容, 加载索引数据
通过二分查找, 找到 row_key 在哪一数据块下
依据布隆过滤器过滤掉不存在的数据块, 减速读取
依据数据块的地位和大小, 找到指定数据块并二分查找指定数据
HBase 数据列族式存储
先简略回顾一下行式存储和列式存储.

「行式存储」

行式存储, 将一行数据存储在一起, 一行数据写完了才会写下一行. 例如典型的 MySQL.

行式存储在读取一行数据的时候是比拟快的, 但如果读取的是某一列数据, 也须要将整行读取到内存中进行过滤.

「列式存储」

与行式存储绝对应的就是列式存储, 既将一列数据存储在一起, 不同列的数据别离存储.

列式存储对于只读取某一列比拟敌对, 但绝对的, 如果要读取多列数据, 须要读取屡次并进行合并.

「列族式存储」

而 HBase 中选用了一种折中的计划, 列族式存储, 将列族放到一起存储, 不同列族别离存储.

那么也就是说, 如果一个表有多个列族, 每个列族下只有一列, 那么就等同于列式存储

如果一个表只有一个列族, 该列族下有多个列, 那么就等同与行式存储.

HBase 会将一张表同一列族的数据, 调配到同一个 region 上, 这个 region 调配在集群中的某一个 regionServer. 所有的 region 存储在表: hbase:meta 表中, 表构造如下:

表不同列含意如下:

row_key 由以下字段拼接 (逗号) 而成
表名
起始 row_key
创立工夫戳
下面三个字段的 md5
info:regioninfo 次要存储以下数据 (json)
STARTKEY: 起始 row_key
ENDKEY: 完结 row_key
NAME: region 名
ENCODED: 不分明是什么
info:seqnumDuringOpen 示意 regionServer 在线时长
info:server 落在哪个 regionServer 上
info:serverstartcode regionServer 的启动工夫
等等

正文完
 0