HBase Flush 流程梳理
HBase Flush 流程梳理
最近在做HBase 写入方面的优化,因为刚接触HBase,在此把HBase Flush流程记录下来,方便以后查阅。作为HBase新手,难免有错误,还望大家指正。本文使用的hbase版本是1.4.12。
HRegionServer
在HRegionServer类中,首先调用initializeThread()方法进行初始化,与Flush相关的主要有两个成员变量:cacheFlusher 和 periodicFlusher 分别属于MemStoreFlusher 和 PeriodicMemstoreFlusher 两个类。在startServiceThreads() 方法中启动这两个对象。
this.cacheFlusher.start(uncaughtExceptionHandler);
if (this.periodicFlusher != null) {
choreService.scheduleChore(periodicFlusher);
}
在HRegionServer中,与Flush相关的超参数有:
- hbase.server.thread.wakefrequency
在master节点:控制一些FS相关行为的调用频率: 检查hdfs是否处于安全模式,设置或检查hbase版本文件,设置或检查hbase.id文件。
在RegionServer节点:flush 检查间隔,compaction 检查间隔,wal回滚间隔。
默认值:10000 (毫秒) - hbase.regionserver.flush.check.period
RegionServer 周期性flush的间隔。
默认值:hbase.server.thread.wakefrequency
PeriodicMemstoreFlusher
PeriodicMemstoreFlusher是HRegionServer的一个静态内部类。继承自抽象类ScheduledChore。初始化的时候,有一个整型成员变量rangeOfDelay用来控制flush的数量。
this.rangeOfDelay = this.server.conf.getInt("hbase.regionserver.periodicmemstoreflusher.rangeofdelayseconds",
RANGE_OF_DELAY)*1000;
整个PeriodicMemstoreFlusher逻辑比较简单,chore()方法如下:
@Override
protected void chore() {
final StringBuffer whyFlush = new StringBuffer();
for (Region r : this.server.onlineRegions.values()) {