HBase你真的了解吗?( 三 )

6.5 MemStore Flush

  • 触发条件
    • MemStore级别限制:当Region中任意一个MemStore的大小达到了上线 , 会触发MemStore刷新hbase.hregion.memstore.flush.size 默认128M
    • Region级别限制:当Region中所有的MemStore的大小和总和达到了上线会触发MemStore刷新hbase.hregion.memstore.block.multiplier*hbase.hregion.memstore.flush.size
    • RegionServer级别限制:当RegionServer中MemStore的大小中和超过低水位阈值 , RegionServer开始强制执行flushhbase.regionserver.global.memstore.size.lower.limit*hbase.regionserver.global.memstore.size
    • 当一个RegionServer中HLog数量达到上线时 , 系统会选取最早的HLog对应的一个或多个Region进行flushhbase.regionserver.maxlogs
    • HBase定期刷新MemStore:默认周期为1小时 , 确保MemStore不会长时间没有持久化
    • 手动执行flush:用户可以通过shell命令flush 'tablename' 或者 flush 'regionname'分别对一个表或者一个Region进行flush
6.6 CompactionCompaction是从一个Region的一个Store中选取部分HFile文件进行合并 。
  • Compacton分类
    • Minor Compaction 是值选取部分小的、相邻的HFile , 将他们合并成一个更大的HFile 。
    • Major Compaction 是指将一个Store中所有的HFile合并成一个HFile , 这个过程还会清理三类无意义的数据:被删除的数据、TTL过期数据、版本号超过超过设定版本号的数据
  • Compaction时机
    • MemStore Flush:MemStore Flush会产生HFile文件 , 因此在每次执行完后 , 都会对当前Store中的文件数进行判断 , 一旦Store中总文件数大于hbase.hstore.compactionThrshold , 就会触发Compaction 。
    • 后台线程周期性检查:RegionServer会在后台启动一个线程CompactionChecker , 定期触发检查对应Store是否要执行Compaction 。 检查周期算法hbase.server.thread.wakefrequency*hbase.server.compactchecker.interval.multiplier
    • 手动触发
6.7 Region Split默认情况下 , 每个Table只有一个Region 。 随着数据的不断写入 , Region会自动进行拆分 , 拆分后的Region会被分配到其他RegionServer上 , 实现HBase的负载均衡 。
  • HBase已经有6种Split触发策略 , 常见的Split策略如下:

HBase你真的了解吗?文章插图
    • ConstantSizeRegionSplitPolicy:表式一个Region中最大Stroe的大小超过设置阈值(hbase.hregion.max.filesize)之后会触发分裂 。
    • IncreasingToUpperBoundRegionSplitPolicy:一个Region中最大Store的大小超过设置阈值就会触发分裂 。 但是这个阈值并不像ConstantSizeRegionSplitPolicy是一个固定的值 , 而是在一定条件下不断调整 , 调整后的阈值大小和Region所属表在当前RegionServer上的Region个数有关系 , 调整后的阈值等于(#regions)*(#regions)*(#regions)* flush size * 2 , 当然阈值并不会无线增大 , 最大值为用户设置的MaxRegionFileSize 。
    • SteppingSplitPolicy:这种分裂阈值也发生了变化 , 相比第二种方式简单了一些 , 分裂阈值大小和待分裂Region所属表在当前RegionServer上的Region个数有关系 , 如果Region个数等于1 , 分裂阈值为 flush size * 2 , 否则为MaxRegionFileSize 。