【HBase】Apache HBase内核深度剖析( 二 )


\
【HBase】Apache HBase内核深度剖析
本文插图

跳跃表与HFile关系
HBase对LSM的应用采用了如上的结构方式 , 对于HBase具体的存储文件的分析 , 在后面专门针对HBase的存储部分进行深入的分析 。
布隆过滤器布隆过滤器解决的问题是 , 如何快速的发现一个元素是否存在于某个集合里面 , 最简单的办法就是在集合或者链表上查找一遍 , 但是考虑到在大数据场景下 , 数据量非常大 , 即便不考虑性能 , 也不见得会有足够多的机器来加载对应的集合 。 所以需要一种新的思路去解决此类问题 , 那么布隆过滤器就是一种 , 它的思想为:

  • 由一个长度为N的数组构成 , 每一个元素为0或者1 , 默认都为0
  • 对集合的每个元素做K次哈希 , 到第i次的时候对N取一个模 , 会得到一个index
  • 将数组中的array[index]变为1

【HBase】Apache HBase内核深度剖析
本文插图

(布隆过滤器 , 来自网络)
上图是长度为18 , 进行3次哈希得到的结果 , 那么在HBase中是如何利用布隆过滤器的呢 , 首先从操作来说 , HBase的Get就经过布隆过滤器 , 同时HBase支持度对不同的列设置不同的布隆过滤器 。
【HBase】Apache HBase内核深度剖析
本文插图

(布隆过滤器类型)
可以看到对HBase来讲可以启用或者禁用过滤器 , 对于不同的过滤器的实现分别在不同的类中 , 在查询的时候分别根据不同的过滤器采用不同的实现类:
【HBase】Apache HBase内核深度剖析
本文插图

(布隆过滤器选择逻辑)
所以可以通过如上的代码找到对应的过滤器实现 , 甚至可以新增自己的过滤器 。
HBase读写操作前面提到HBase的相关算法 , 现在我们讲一下HBase的整个操作的读写流程 。 首先 , 摆出HBase的架构图 , 如下所示:
【HBase】Apache HBase内核深度剖析
本文插图

(HBase架构图 , 来自网络)
从这个图可以看到 , HBase的一个写操作 , 大的流程会经过三个地方:1. 客户端 , 2. RegionServer 3. Memstore刷新到磁盘 。 也就是说对于HBase的一次写入操作来讲 , 数据落到Memstore就算写入完成 , 那么必然需要考虑一个问题 , 那就是没有落盘的数据 , 万一机器发生故障 , 这部分数据如何保障不丢失 。 解析来我们逐步分解一下这三个部分 。
客户端:HBase的客户端和服务器并不是单一的链接 , 而是在封装完数据后 , 通过请求HMaster获取该次写入对应的RegionServer的地址 , 然后直接链接RegionServer , 进行写入操作 , 对于客户端的数据封装来讲 , HBase支持在客户端设置本地缓存 , 也就是批量提交还是实时提交 。 因为HBase的hbase:meta表中记录了RegionServer的信息 , HBase的数据均衡是根据rowkey进行分配 , 因此客户端会根据rowkey查找到对应的RegionServer , 定义在Connection中:
【HBase】Apache HBase内核深度剖析
本文插图

而实现在:AsyncRegionLocator
【HBase】Apache HBase内核深度剖析
本文插图

RegionServer写入:当客户端拿到对应的RegionServer后 , 便和HMaster没有关系了 , 开始了直接的数据传输 , 我们前面提到一个问题 , 那就是HBase如何防止数据丢失 , 毕竟HBase的写入是到内存 , 一次请求就返回了 , 解决这个问题是通过WAL日志文件来解决的 , 任何一次写入操作 , 首先写入的是WAL , 这类日志存储格式和Kafka类似的顺序追加 , 但是具有时效性 , 也就是当数据落盘成功 , 并且经过检查无误之后 , 这部分日志会清楚 , 以保障HBase具有一个较好的性能 , 当写完日志文件后 , 再写入Memstore 。


推荐阅读