MemStore 调优
HBase会在如下几种情况下触发flush操作,需要注意的是MemStore的最小flush单元是HRegion而不是单个MemStore。可想而知,如果一个HRegion中Memstore过多,每次flush的开销必然会很大,因此建议在进行表设计的时候尽量减少ColumnFamily的个数以及长度。触发时机有下面几种情况 checkResource Memstore级别限制 MemStoreFlusher周期性检查 max logs限制 手动flush Region合并 Region分裂 Bulk HFile 做Table的快照 checkResource 源码跟踪流程Put -> checkResource -> HReion::flushcache -> internalFlushcache -> internalFlushCacheAndCommit checkResource是在客户端Put、Delete、Update操作时,执行checkResource操作做如下检查 1)Meta Region(HBase系统表,hbase:acl,hbase:meta,hbase:namespace),不做资源约束或者阻塞更新操作。 2)如果Region当前内存大小memstoreSize超过阈值blockingMemStoreSize(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size)则更新阻塞请求计数器,发起刷新MemStore请求,并抛出RegionTooBusyException异常,阻塞数据更新操作。 3)触发flush 核心代码如下。 a. checkResource private void checkResources() throws RegionTooBusyException { // If catalog region, do not impose resource constraints or block updates. if (this.getRegionInfo().isMetaRegion()) return; if (this.memstoreSize.g