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

        

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

  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3067636.html
Copyright © 2011-2022 走看看