Hbase数据刷写
数据刷写
1.触发时机
- MemStore内存默认是128M,当某个MemStore超过128M就会将其所在 region 的所有 memstore 都会刷写。
- 如果我们数据增加的很快,哪怕一到128M就刷写数据量还是在增加(数据增加速度大于刷写速度),当MemStore达到128*4=512MB的时候,就会阻止客户端写入数据到该MemStore
- 当 RegionServer的所有MemStore 占用内存总和大于总内存 *40% *95%的时候,整个RegionServer开始进行刷写
- 如果达到了 RegionServer 级别的 Flush,当前 RegionServer 的所有写操作将会被阻塞,这个阻塞可能会持续到分钟级别
- 当 WAL 文件的数量超过 hbase.regionserver.max.logs,region 会按照时间顺序依次进行刷写,直到 WAL 文件数量减小到 hbase.regionserver.max.log 以下(该属性名已经废弃,现无需手动设置,最大值为 32)
- 数据到达 Region 的时候是先写入 WAL,然后再被写到 Memstore
- 如果WAL 的数量越来越大,这就意味着 MemStore 中未持久化到磁盘的数据越来越多
- 当 RS 挂掉的时候,恢复时间将会变得很长,所以有必要在 WAL 到达一定的数量时进行一次刷写操作
- 自定义刷写的时间间隔,当达到自动刷写的时间,就会触发 memstore flush开始自动刷写
- 在Shell 中通过执行 flush 命令,手动触发刷写
- 注意:
- 以上所有条件触发的刷写操作最后都会检查对应的 HStore 包含的 StoreFiles 文件数是否超过hbase.hstore.blockingStoreFiles 参数配置的个数,默认值是16
- 如果满足这个条件,那么当前刷写会被推迟到hbase.hstore.blockingWaitTime 参数设置的时间后再刷写
- 在阻塞刷写的同时,Hbase 还会请求 Compaction 或者Split 操作
2.刷写策略
- 1.1之前
- MemStore刷写是Region级别的,列簇不超过三个
- 就是说,如果要刷写某个 MemStore ,MemStore 所在的 Region 中其他 MemStore 也是会被一起刷写的
- 2.2之后
- 1.Region所有的 MemStore都进行刷写
- 2.设置一个阈值
- 判断 Region 中每个 MemStore 的使用内存是否大于这个个阀值,大于这个阀值的MemStore 将会被刷写
- memstore分两类
3.刷写流程
- prepareFlush 阶段
- 如果MEM要进行刷写,首先会对MemStore 做 snapshot快照
- 拍照期间内存的数据会被锁定
-
- 这是为了防止刷写过程中更新的数据同时在 snapshot 和 MemStore 中而造成后续处理的困难,所以在刷写期间需要持有 updateLock
- 但是这将阻塞客户端的写操作,因为拍照时间比较短所以影响一般比较小
- flushCache 阶段
- flushCache 阶段
- 将快照的数据写成一个临时文件
- 临时文件是存放在对应 Region 文件夹下面的 .tmp 目录里面
- commit 阶段
- 将临时文件移到(rename)对应的列族目录下
- 并做一些清理工作,比如删除第一步生成的 snapshot