HBase会在如下几种情况下触发flush操作,需要注意的是MemStore的最小flush单元是HRegion而不是单个MemStore。可想而知,如果一个HRegion中Memstore过多,每次flush的开销必然会很大,因此我们也建议在进行表设计的时候尽量减少ColumnFamily的个数。hbase官方文档总结的刷写时机有6种:
第一个会在hbase的update时候发生,首先会调用checkResources()方法检查资源,这个checkResources()实际上就是检查HRegion的MemStore大小是否超过一定的阈值(hbase.hregion.memstore.flush.size),如果超过,则会调用requestFlush()方法发起对该HRegion的MemStore进行flush的请求,并抛出RegionTooBusyException异常,阻止该操作继续,后续将要讲的Delete、Append等数据更新操作也是如此,在开始执行操作前都会调用这个checkResources()方法来检查资源。而requestFlush方法核心的方法即是调用HRegion的flushcache方法。
第二个是region的splite/merge/compact,在做这些region级别的操作前,都会直接调用flushchache()方法(有关这个方法在上一篇文档中有详细分析),然后再执行操作。这个比较好理解,因为一个region根据CF对应了一系列的Memstore,当region发生变更时所对应的CF的Memstore肯定需要做相应调整,所以要持久化刷硬盘。一般这些过程在hmaster和zk的帮助下都进行的比较快。
第三个是PeriodMemStoreFlusher来定时的刷memstore。
这个定时任务也比较简单,就是定时去检查对应的region以及RegionServer的memstore是否到达了阈值然后去刷写。
需要注意的regionserver的刷写会阻塞整个rs的写,而且这时候很容易发生fullgc,这将很影响整个集群的性能,所以在hbase的文档中也建议,在业务低峰期进行手动刷写,保证不在业务高峰的时候触发memstore刷写条件而影响性能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。