HBase——Memstore冲洗和冲壳操作深度解析

  

//memstore冲洗机制和冲壳命令刷新
//memstore是HBase框架中非常重要的组成部分之一,是HBase能够实现高性能随机读写至关重要的一环。深入理解memstore的工作原理,运行机制以及相关配置,对HBase集群管理、性能调优都有着非常重要的帮助。

  

写机制(大约)
1, HBase是基于LSM-Tree模型的,
2,所有的数据更新插入操作都首先写入Memstore中(同时会顺序写到日志HLog中),
3,达到指定大小之后再将这些修改操作批量写入磁盘,生成一个新的HFile文件,这种设计可以极大地提升HBase的写入性能,
4, HBase为了方便按照RowKey进行检索,要求HFile中数据都按照RowKey进行排序,
5, Memstore数据在冲洗为HFile之前会进行一次排序,将数据有序化;

  

读机制(大约)
1,根据局部性原理,新写入的数据会更大概率被读取,
2,因此HBase在读取数据的时候首先检查请求的数据是否在Memstore,
3,写缓存未命中的话再到读缓存中查找,读缓存还未命中才会到HFile文件中查找,最终返回合并的一个结果给用户。

  

//可见,Memstore无论是对HBase的写入性能还是读取性能都至关重要。其中冲洗操作又是Memstore最核心的操作。

  

问题:
接下来重点针对Memstore的冲洗操作进行深入地解析:
1,首先分析HBase在哪些场景下会触发冲,
2,然后结合源代码分析整个冲洗的操作流程。
3,最后再重点整理总结和冲洗相关的配置参数,这些参数对于性能调优,问题定位都非常重要。

  

HBase会在如下几种情况下触发冲操作?
//提示:
需要注意的是MemStore的最小冲单元是HRegion而不是单个MemStore。//这就话可以理解是不是
当一个地区是2个列族的时候,就会有2个MemStore比如如果其中一个menstore=128了,另一个没有达到128不会冲洗
只有当区域中的2个MemStore都达到了128的时候,才会触发真正的刷新区域级别的冲洗
可想而知,如果一个HRegion中MemStore过多,每次冲洗的开销必然会很大,因此我们也建议在进行表设计的时候尽量减少ColumnFamily的个数。建议列族为1 - 3个,热门业务的列族就设计成1个
1, MemStore级别限制:当区域中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128 mb),会触发MemStore刷新。
2,区域级别限制:当区域中所有MemStore的大小总和达到了上限(hbase.hregion.memstore.block。乘数 hbase.hregion.memstore.flush。大小,默认2 128米=256米),会触发memstore刷新。
3,区域服务器级别限制:当一个地区的服务器中所有memstore的大小总和达到了上限(hbase.regionserver.global.memstore。upperLimit * hbase_heapsize,默认40%的JVM内存使用量),会触发部分Memstore刷新.Flush顺序是按照Memstore由大到小执行,先冲洗Memstore最大的地区,再执行次大的,直至总体Memstore内存使用量低于阈值(hbase.regionserver.global.memstore。lowerLimit * hbase_heapsize,默认38%的JVM内存使用量)。
//影响很大
4,当一个地区的服务器中HLog数量达到上限(可通过参数hbase.regionserver。maxlogs配置)时,系统会选取最早的一个HLog对应的一个或多个地区进行平
5, HBase定期刷新Memstore:默认周期为1小时,确保Memstore不会长时间没有持久化。为避免所有的Memstore在同一时间都进行平导致的问题,定期的冲洗操作有20000左右的随机延时。
6,手动执行冲洗:用户可以通过壳命令冲“表”或者平的地区名称分别对一个表或者一个地区进行冲洗。
//6种方式可以触发冲的操作,以上参数在鼎晖中都有

  

Memstore冲流程//具体见博客
为了减少冲过程对读写的影响,HBase采用了类似于两阶段提交的方式,将整个冲过程分为三个阶段:
1,准备阶段
(1)遍历当前区域中的所有Memstore,将Memstore中当前数据集kvset做一个快照快照,然后再新建一个新的kvset。
(2)后期的所有写入操作都会写入新的kvset中,而整个冲阶段读操作会首先分别遍历kvset和快照,如果查找不到再会到HFile中查找。
(3)准备阶段需要加一把updateLock对写请求阻塞,结束之后会释放该锁。
(4)因为此阶段没有任何费时操作,因此持锁时间很短
2,冲阶段
(1)遍历所有Memstore,将准备阶段生成的快照持久化为临时文件,临时文件会统一放到目录.tmp下。
(2)这个过程因为涉及到磁盘IO操作,因此相对比较耗时。
3,提交阶段
(1)遍历所有的Memstore,将冲阶段生成的临时文件移到指定的ColumnFamily目录下,
(2)针对HFile生成对应的storefile和读者,把storefile添加到HStore的storefiles列表中,
(3)最后再清空准备阶段生成的快照。

HBase——Memstore冲洗和冲壳操作深度解析