13.大数据学习之旅——HBase第三天

LSM-TREE


概述

众所周知传统磁盘I/O是比较耗性能的,优化系统性能往往需要和磁盘I/O打交道,而磁盘I/O产
生的时延主要由下面3个因素决定:
1)寻道时间(将磁盘臂移动到适当的柱面上所需要的时间,寻道时移动到相邻柱面移动所需
时间1ms,而随机移动所需时间位5~10ms)
2)旋转时间(等待适当的扇区旋转到磁头下所需要的时间)
3)实际数据传输时间(低端硬盘的传输速率为5MB/ms,而高速硬盘的速率是10MB/ms)
近20年平均寻道时间改进了7倍,传输速率改进了1300倍,而容量的改进则高达50000倍,这
一格局主要是因为磁盘中运动部件的改进相对缓慢和渐进,而记录表面则达到了相当高的密
度。对于一个块的访问完全由寻道时间和旋转延迟所决定,所以花费相同时间访问一个盘块,
那么取的数据越多越好。
磁盘I/O瓶颈可能出现在seek(寻道)和transfer(数据传输)上面。
根据磁盘I/O类型,关系型存储引擎中广泛使用的B树及B+树,而Bigtable的存储架构基础的会
使用Log-Structured Merge Tree。

B- Tree和B+Tree

如果没有太多的写操作,B+树可以工作的很好,它会进行比较繁重的优化来保证较低的访问
时间。而写操作往往是随机的,随机写到磁盘的不同位置上,更新和删除都是以磁盘seek的速
率级别进行的。RDBMS通常都是Seek型的,主要是由用于存储数据的B树或者是B+树结构引起
的,在磁盘seek的速率级别上实现各种操作,通常每个访问需要log(N)个seek操作

LSM-Tree

而LSM-tree工作在磁盘传输速率的级别上,可以更好地扩展到更大的数据规模上,保证一个比
较一致的插入速率,因为它会使用日志文件和一个内存存储结构,将随机写操作转化为顺序
写。
在传输等量数据场景下,随机写I/O的时延大部分花费在了seek操作上,数据库对磁盘进行零
碎的随机写会产生多次seek操作;而顺序存取只需一次seek操作,便可以传输大量数据,针对
批量写入大量数据的场景,顺序写比随机写具有明显的优势。
The Log-Structured Merge-Tree(LSM-Tree)的一个重要思想就是通过使用某种算法,该算法会对
索引变更进行延迟及批量处理,并通过一种类似于归并排序的方式高效地将更新迁移到磁盘,
进行批量写入,利用磁盘顺序写性能远好于随机写这一特点,将随机写转变为顺序写,从而保
证对磁盘的操作是顺序的,以提升写性能,同时建立索引,以获取较快的读性能,在读和写性
能之间做一个平衡。
插入100亿条数据,每条数据大约100kb。
比如更新1%的数据,如果用B-tree,用时100天
如果用LSM-TREE,用时1天。

LSM-Tree原理
在这里插入图片描述
c0 Tree 是存在内存的的树结构,可以是(B-树,B+树,二叉树,跳跃表)
c1 Tree 是存在磁盘上的文件(本身也是一个树结构)
写入或者更新某条记录时,首先会预写日志,用于数据写入失败时进行数据恢复。之后
该条记录会被插入到驻留在内存中的C0树,在符合某个条件的时候从被移到磁盘上的C1树
中。

C0树不一定要具有一个类B-树的结构。HBase中采用了线程安全的ConcurrentSkipListMap
数据结构。
向内存中的C0树插入一个条目速度是非常快的,因为操作不会产生磁盘I/O开销。然而用于
C0的内存成本要远高于磁盘,通常做法是限制它的大小。采用一种有效的方式来将记录迁移
到驻留在更低成本的存储设备上的C1树中。为了实现这个目的,在当C0树因插入操作而达到
接近某个上限的阈值大小时,就会启动一个rolling merge过程,来将某些连续的记录段(保
证是顺序写)从C0树中删除,并merge到磁盘上的C1树中。
在这里插入图片描述

磁盘上的C1树是一个类似于B-Tree的数据结构,但是它是为顺序性的磁盘访问优化过的。

HBase的实现
MemStore
MemStore是HBase中C0的实现,向HBase中写数据的时候,首先会写到内存中的
MemStore,当达到一定阀值之后,flush(顺序写)到磁盘,形成新的StoreFile(HFile),最后
多个StoreFile(HFile)又会进行Compact。
memstore内部维护了一个数据结构:ConcurrentSkipListMap,数据存储是按照RowKey排
好序的跳跃列表。跳跃列表的算法有同平衡树一样的渐进的预期时间边界,并且更简单、更快
速和使用更少的空间。
在这里插入图片描述

HFile

HFlile是lsm tree中C1的实现

BloomFilter


背景说明

Hash 函数在计算机领域,尤其是数据快速查找领域,加密领域用的极广。
其作用是将一个大的数据集映射到一个小的数据集上面(这些小的数据集叫做哈希值,或者散列
值)。
Hash table(散列表,也叫哈希表),是根据哈希值(Key value)而直接进行访问的数据结构。也就是
说,它通过把哈希值映射到表中一个位置来访问记录,以加快查找的速度。下面是一个典型的示意
图:
在这里插入图片描述

但是这种简单的Hash Table存在一定的问题,就是Hash冲突的问题。假设 Hash 函数是良好的,如果
我们的位阵列长度为 m 个点,那么如果我们想将冲突率降低到例如 1%, 这个散列表就只能容纳 m *
1% 个元素。显然这就不叫空间有效了(Space-efficient)。

Bloom Filter概述
Bloom Filter是1970年由布隆(Burton Howard Bloom)提出的。它实际上是一个很长的二进制向
量和一系列随机映射函数(Hash函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的
优点是空间效率和查询时间都远远超过一般的算法。Bloom Filter广泛的应用于各种需要查询的场合
中,如:
Google 著名的分布式数据库 Bigtable 使用了布隆过滤器来查找不存在的行或列,以减少磁盘查找的
IO次数。
在很多Key-Value系统中也使用了布隆过滤器来加快查询过程,如 Hbase,Accumulo,Leveldb,一
般而言,Value 保存在磁盘中,访问磁盘需要花费大量时间,然而使用布隆过滤器可以快速判断某个
Key对应的Value是否存在,因此可以避免很多不必要的磁盘IO操作,只是引入布隆过滤器会带来一定
的内存消耗。

Bloom Filter 原理
如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。
链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检
索速度也越来越慢。
一个Bloom Filter是基于一个m位的位向量(b1,…bm),这些位向量的初始值为0。另外,还有一系
列的hash函数(h1,…hk),这些hash函数的值域属于1~m。下图是一个bloom filter插入x,y,z并判断
某个值w是否在该数据集的示意图:
在这里插入图片描述
但是布隆过滤器的缺点和优点一样明显。误算率(False Positive)是其中之一。随着存入的元素数量
增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣。
总结:Bloom Filter 通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正
确的场合。此外,引入布隆过滤器会带来一定的内存消耗。

上一篇 12.大数据学习之旅——HBase第二天

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值