HBase 数据存储结构
在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 的启动时间
- 等等
总结
简单了解了HBase的数据落盘格式, 也大概解释 HBase 的很多疑惑, 比如:
- 为什么只支持 row key 索引查询
- 因为整个文件是按照 row key 排序的
- 为什么读取效率比 MySQL 低
- 因为要依次读取文件进行查找
- 为什么支持高效率的写入操作
- 因为全部都是顺序读写操作
- 应该如何设置 HBase 的列族
- 将同一场景读取的放到同一列族下, 不同场景读取的放到不同列族下
- 等等
HBase 数据存储结构的更多相关文章
- HBase 的存储结构
HBase 的存储结构 2016-10-17 杜亦舒 HBase 中的表常常是超级大表,这么大的表,在 HBase 中是如何存储的呢?HBase 会对表按行进行切分,划分为多个区域块儿,每个块儿名为 ...
- Cassandra 的数据存储结构——本质是SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>
Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型.它借鉴了 Amazon 的 Dynamo 和 Google's BigTab ...
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
- kafka 数据存储结构+原理+基本操作命令
数据存储结构: Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的.每个topic又可以分成几个不同的partition(每个topic有几个partitio ...
- HBase介绍(2)---数据存储结构
在本文中的HBase术语:基于列:column-oriented行:row列组:column families列:column单元:cell 理解HBase(一个开源的Google的BigTable实 ...
- HBase数据存储
HRegionServer  HBase的数据文件都存储在HDFS上,格式主要有两种: - HFile:HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制文件,实际上Sto ...
- BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览
一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...
- Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析
Hashtable 是一个很常见的数据结构类型,前段时间阿里的面试官说只要搞懂了HashTable,hashMap,HashSet,treeMap,treeSet这几个数据结构,阿里的数据结构面试没问 ...
- 使用MapReduce读取HBase数据存储到MySQL
Mapper读取HBase数据 package MapReduce; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hba ...
随机推荐
- 从零开始教你安装Oracle数据库
1.数据库安装 1.1下载 根据自己的操作系统位数,到oracle官网下载(以oracle 11g 为例) 之后把两个压缩包解压到同一个文件夹内(需要注意的是,这个文件夹路径名称中最好不要出现中文.空 ...
- Grakn Forces 2020
比赛链接:https://codeforces.com/contest/1408 A. Circle Coloring 题意 给出三个长为 $n$ 的序列 $a,b,c$,对于每个 $i$,$a_i ...
- AtCoder Beginner Contest 179 E - Sequence Sum (模拟)
题意:\(f(x,m)\)表示\(x\ mod\ m\),\(A_{1}=1\),而\(A_{n+1}=f(A^{2}_{n},M)\),求\(\sum^{n}_{i=1}A_{i}\). 题解:多算 ...
- Python 分析热卖年货,今年春节大家都在送啥?
今年不知道有多少小伙伴留在原地过年,虽然今年过年不能回老家,但这个年也得过,也得买年货,给家人长辈送礼.于是我出于好奇心的想法利用爬虫获取某宝数据,并结合 Python 数据分析和第三方可视化平台来分 ...
- Ubuntu——常用命令
一.进入文件夹 1.cd .. # 进入上一个文件夹 2.cd ../.. # 进入上两个文件夹 3.cd - # 去到进入当前文件夹之前的那个文件夹 二.复制文件 cp 目标文件 复制文件名 三.移 ...
- Nginx 版本回滚
目录 参考信息 源码安装 nginx-1.14.2 版本升级 nginx-1.16.1 版本回滚 ①.对于软件的版本升级.添加官方模块.添加第三方模块,都需要用源码安装包重新生成(configure) ...
- Playbook 角色(Roles) 和 Include 语句
简介 当我们刚开始学习运用 playbook 时,可能会把 playbook 写成一个很大的文件,到后来可能你会希望这些文件是可以方便去重用的,所以需要重新去组织这些文件. Include 语句 基本 ...
- 3.安装可视化工具kibana
作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-19 10:10:42 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...
- HEXO添加置顶功能
使用库:参考 http://wangwlj.com/2018/01/09/blog_pin_post/ 目前已经有修改后支持置顶的仓库,可以直接用以下命令安装.(cmd 到博客根目录,nmp运行) $ ...
- HDU - 4455 Substrings(非原创)
XXX has an array of length n. XXX wants to know that, for a given w, what is the sum of the distinct ...