《HBase权威指南》读书笔记(一)

第8章 架构

8.1 数据查找和传输

8.1.1 B+树

B树的一些特性使其能够通过主键对记录进行高效插入、査找以及删除。它表示为一个动态、多层并有上下界的索引。同时要注意维护每一段(也被称作页表)所包含的主键数目。分段B+树的效果远好于二叉树的数据划分,其大大减少了查询特定主键所需的IO操作。

除此以外,B+树能够提供髙效的范围扫描功能,这得益于它的叶节点相互连接并且按主键有序,扫描时避免了耗时的遍历树操作。这也是B+树被关系型数据库用作索引的原因之一。
在这里插入图片描述
如果要进行一次范围査询,则可能需要读取多个在磁盘上不连续甚至可能相隔很远的叶节点页表。这也是为什么我们在大部分基于B+树的设计中都能找到一组被称为OPTIMIZE TABLE命令的原因,B+树这种数据组织方式只是简单地按顺序把表重写,从而使表的范围查询变成了磁盘的多段连续读取。

8.1.2 LSM树

LSM树(log-structured merge-tree)。则按另一种方式组织数据。输入数据首先被存储在日志文件,这些文件内的数据完全有序。当有日志文件被修改时,对应的更新会被先保存在内存中来加速查询。

当系统经历过许多次数据修改,且内存空间被逐渐被占满后,LSM树会把有序的“键记录”对写到磁盘中,同时创建一个新的数据存储文件。此时,因为最近的修改都被持久化了,内存中保存的最近更新就可以被丢弃了。

存储文件的组织与B树相似,不过其为磁盘顺序读取做了优化,所有节点都是满的并按页存储。修改数据文件的操作通过滚动合并完成,也就是说,系统将现有的页与内存刷写数据混合在一起进行管理,直到数据块达到它的容量。
在这里插入图片描述
多次数据刷写之后会创建许多数据存储文件,后台线程就会自动将小文件聚合成大文件,这样磁盘查找就会被限制在少数几个数据存储文件中。磁盘上的树结构也可以拆分成独立的小单元,这样更新就可以被分散到多个数据存储文件中。所有的数据存储文件都按键排序,所以没有必要在存储文件中为新的键预留位置。

查询时先查找内存中的存储,然后再查找磁盘上的文件。这样在客户端看来数据存储文件的位置是透明的。

删除是一种特殊的更改,当删除标记被存储之后,査找会跳过这些删除过的键。当页被重写时,有删除标记的键会被丢弃。

比较B+树和LSM树的意义在于理解它们的相对优势和不足。在没有太多的修改时,B+树表现得很好,因为这些修改要求执行高代价的优化操作以保证查询能在有限时间内完成。在任意位置添加数据的规模越大、速度越快,这些页成为碎片的速度就越快。最后,用户写入的速度可能比优化后重写文件的处理速度更快。由于更新和删除以磁盘寻道的速率完成,这就强制用户就范于磁盘提供的较差的性能指标。

LSM树以磁盘传输速率工作并能较好地扩展以处理大量的数据。它们使用日志文件和内存存储来将随机写转换成顺序写,因此也能保证稳定的数据插入速率。由于读和写独立,因此在这两种操作之间没有冲突。

由于存储数据的布局较优,查询一个键需要的磁盘寻道次数在一个可预测的范围内,并且读取与该键连续的任意数量的记录都不会引发任何额外的磁盘寻道。一般来说,基于LSM树的系统强调的是成本透明:假如有5个存储文件,一个访问需要最多5次磁盘寻道。反观关系型数据库,即使在存在索引的情况下,它也没有办法确定一次查询需要的磁盘寻道次数。

8.2 存储

8.2.1 概览

在这里插入图片描述
从这张图可以看出HBase主要处理两种文件:一种是预写日志(Write-Ahead Log WAL),另一种是实际的数据文件。这两种文件主要由 HRegionServer管理。

一个基本的流程是客户端首先联系 ZooKeeper子集群(quorum)(一个由 ZooKeeper节点组成的单独集群)査找行键。上述过程是通过ZooKeeper获取含有-ROOT-的region服务器名(主机名)来完成的。通过含有-ROOT-的 region服务器可以查询到含有.META.表中对应的 region服务器名,其中包含请求的行键信息。这两处的主要内容都被缓存下来了,并且都只查询一次。最终,通过查询META服务器来获取客户端查询的行键数据所在region的服务器名。

一旦知道了数据的实际位置,即 region的位置,HBase会缓存这次查询的信息,同时直接联系管理实际数据的HRegionServer。所以,之后客户端可以通过缓存信息很好地定位所需的数据位置,而不用再次查找META表。

启动 HBase时,MAster负责将所有region分配到每个HRegionServer上,
其中也包括特别的-ROOT-和.META.表。

HRegionServer负责打开region,并创建对应的HRegion实例。当HRegion被打开后它会为每个表的HColumnFamily创建一个Store实例,这些列族是用户之前创建表时定义的。每个Strore实例包含一个或多个StoreFile实例,它们是实际数据存储文件HFile的轻量级封装。每个Store还有其对应的一个 MemStore,一个 HRegionServer分享一个HLog实例。

8.2.2 写路径

当用户向HRegionServer发起HTable.put(Put)请求时,其会将请求交给对应的HRegion实例来处理&

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值