首先,需要明确的是,HBase写入速度比读取速度要快,根本原因LSM存储引擎 。
LSM树全称是基于日志结构的合并树(Log-Structured Merge-Tree) 。No-SQL数据库一般采用LSM树作为数据结构,HBase也不例外 。
一、RDBMS采用B+树作为索引的数据结构众所周知,RDBMS一般采用B+树作为索引的数据结构,如图所示 。RDBMS中的B+树一般是3层n路的平衡树 。B+树的节点对应于磁盘数据块 。因此对于RDBMS,数据更新操作需要5次磁盘操作(从B+树3次找到记录所在数据块,再加上一次读和一次写) 。
在RDBMS中,数据随机无序写在磁盘块中,如果没有B+树,读性能会很低 。B+树对于数据读操作能很好地提高性能,但对于数据写,效率不高 。对于大型分布式数据系统,B+树还无法与LSM树相抗衡 。
文章插图
二、HBase中的LSM树LSM树可以看成n层合并树 。LSM树本质上就是在读写之间取得平衡,和B+树相比,它牺牲了部分读性能,用来大幅提高写性能 。
在HBase中,它把随机写转换成对MemStore和HFile的连续写 。下图展示了LSM树数据写的过程 。
文章插图
数据写(插入,更新):数据首先顺序写入HLog (WAL),然后写到MemStore 。在MemStore中,数据是一个2层B+树(图中的C0树) 。MemStore满了之后,数据会被刷到StoreFile (HFile) 。在StoreFile中,数据是3层B+树(图中的C1树),并针对顺序磁盘操作进行优化 。
数据读:首先搜索MemStore,如果不在MemStore中,则到StoreFile中寻找 。
数据删除:不会去删除磁盘上的数据,而是为数据添加一个删除标记 。在随后的major compaction中,被删除的数据和删除标记才会真的被删除 。
LSM数据更新只在内存中操作,没有磁盘访问,因此比B+树要快 。对于数据读来说,如果读取的是最近访问过的数据,LSM树能减少磁盘访问,提高性能 。
【HBase读取数据快还是写数据快?】
推荐阅读
- 使用 ZeroMQ 消息库在 C 和 Python 间共享数据
- 工行“去O”数据库选型与分布式架构设计
- 智能手表|200块手环和3000元手表 记录数据差距不是一般大:钱没白花
- 数据湖到底是什么湖?
- Excel实现带开关的数据突出显示
- 手机wifi很快,为何移动数据慢?手机用wifi正常用移动网很慢?
- 利用sql注入--拿下某违法网站数据
- 如何消息队列的数据积压问题
- Python数据分析,清洗数据 7 步走
- 人力资源|藏在裁员大数据中的企业密码