[HBase] LSM树 VS B+树

原创 2013年05月08日 09:42:44

LSM树是HBase里非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。

1 B+树

相信大家对B+树已经非常的熟悉,比如Oracle的普通索引就是采用B+树的方式,下面是一个B+树的例子:



根节点和枝节点很简单,分别记录每个叶子节点的最小值,并用一个指针指向叶子节点。

叶子节点里每个键值都指向真正的数据块(如Oracle里的RowID),每个叶子节点都有前指针和后指针,这是为了做范围查询时,叶子节点间可以直接跳转,从而避免再去回溯至枝和跟节点。

B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO。

对于大量的随机写也一样,举一个插入key跨度很大的例子,如7->1000->3->2000 ... 新插入的数据存储在磁盘上相隔很远,会产生大量的随机写IO.

从上面可以看出,低下的磁盘寻道速度严重影响性能(近些年来,磁盘寻道速度的发展几乎处于停滞的状态)。

2 LSM树

为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees。

为了更好的说明LSM树的原理,下面举个比较极端的例子:

现在假设有1000个节点的随机key,对于磁盘来说,肯定是把这1000个节点顺序写入磁盘最快,但是这样一来,读就悲剧了,因为key在磁盘中完全无序,每次读取都要全扫描;

那么,为了让读性能尽量高,数据在磁盘中必须得有序,这就是B+树的原理,但是写就悲剧了,因为会产生大量的随机IO,磁盘寻道速度跟不上。

LSM树本质上就是在读写之间取得平衡,和B+树相比,它牺牲了部分读性能,用来大幅提高写性能

它的原理是把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历所有的小树,但在每颗小树内部数据是有序的。



以上就是LSM树最本质的原理,有了原理,再看具体的技术就很简单了。

1)首先说说为什么要有WAL(Write Ahead Log),很简单,因为数据是先写到内存中,如果断电,内存中的数据会丢失,因此为了保护内存中的数据,需要在磁盘上先记录logfile,当内存中的数据flush到磁盘上时,就可以抛弃相应的Logfile。

2)什么是memstore, storefile?很简单,上面说过,LSM树就是一堆小树,在内存中的小树即memstore,每次flush,内存中的memstore变成磁盘上一个新的storefile。

3)为什么会有compact?很简单,随着小树越来越多,读的性能会越来越差,因此需要在适当的时候,对磁盘中的小树进行merge,多棵小树变成一颗大树。


B+树与LSM树的区别与联系

首先来回答一个问题:为什么在磁盘中要使用b+树来进行文件存储呢? 原因还是因为树的高度低得缘故,磁盘本身是一个顺序读写快,随机读写慢的系统,那么如果想高效的从磁盘中找到数据,势必需要满足一个最重要的...
  • yyd19921214
  • yyd19921214
  • 2017年04月08日 16:36
  • 1574

B+树和LSM比较

B+树和LSM比较
  • u013928917
  • u013928917
  • 2017年07月23日 15:29
  • 432

hbase LSM树个人理解

写这些只是记录自己平时看资料的成果,无关其他。 先记录下B树和B+树 B树(官方定义): 1、根节点至少有两个子节点 2、每个节点有M-1个key,并且以升序排列 3、位于M-1和M key...
  • qq_19917081
  • qq_19917081
  • 2016年09月26日 16:03
  • 241

B树、B+树、LSM树以及其典型应用场景

前言动态查找树主要有:二叉查找树、平衡二叉树、红黑树、B树、B+树。前面三种是典型的二叉查找树,查找的时间复杂度是O(log2N)与树的深度有关系,那么降低树的深度也就可以提升查找效率。这时就提出了平...
  • u010853261
  • u010853261
  • 2017年10月12日 17:50
  • 479

HBase(2.5)-LSM树(基于日志结构的合并树)

1. LSM(Log-StructuredMerge-Tree)树 随着NoSQL系统尤其是类BigTable系统的流行,LSM的文件系统越来越让人熟知。LSM主要用于为那些长期具有很高记录更新(插...
  • yyl424525
  • yyl424525
  • 2017年08月23日 14:42
  • 406

Hbase中LSM索引思想

我们首先介绍一下B+树:Oracle的普通索引就是采用B+树的方式; 根节点和枝节点很简单,分别记录每个叶子节点的最小值,并用一个指针指向叶子节点。 叶子节点里每个键值都指向真正的数据块(...
  • nuisthou
  • nuisthou
  • 2015年10月19日 15:15
  • 1071

B树,B+树、R树(地图)、LSM(Log-Structured Merge Tree)树、Trie树(字典树)

http://blog.csdn.net/hguisu/article/details/7776068
  • slowdownthenrunfast
  • slowdownthenrunfast
  • 2014年07月01日 15:58
  • 779

HBase-LSM树理解

讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎  是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-valu...
  • baigoohao
  • baigoohao
  • 2016年02月22日 21:31
  • 518

[HBase] LSM树 VS B+树

http://www.oschina.net/question/565065_113615
  • nicholaskong
  • nicholaskong
  • 2014年06月13日 09:08
  • 335

HBase LSM树

HBase文件系统LSM数据结构的主题思想与特点
  • u014432433
  • u014432433
  • 2016年06月01日 18:02
  • 1176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[HBase] LSM树 VS B+树
举报原因:
原因补充:

(最多只允许输入30个字)