zoukankan      html  css  js  c++  java
  • 树磁盘[HBase] LSM树 VS B+树

    废话就不多说了,开始。。。

        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,多棵小树成变一颗大树。

        

    文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
    “如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
    “如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
    “如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
    “如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
      最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”

  • 相关阅读:
    面向对象第三单元博客作业
    面向对象编程第2次总结(电梯作业)
    面向对象编程第1次总结
    OOP 第四章博客总结
    OO 第三章总结
    OOP 第二章作业总结
    Java 设计模式 -- 代理模式
    ASID 与 MIPS 中 TLB 相关
    Java 锁机制总结
    OOP 第一章作业总结
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3067636.html
Copyright © 2011-2022 走看看