HFile和Hlog是HBase中两大文件存在格式,HFile用于存储数据,Hlog用于保证数据写入HFile中。
两者都有自己的cleaner逻辑。HFileCleaner和LogCleaner都是继承CleanerChore类
public class HFileCleaner extends CleanerChore<BaseHFileCleanerDelegate>
public class LogCleaner extends CleanerChore<BaseLogCleanerDelegate>
需要说明的是LogCleaner 除了默认的org.apache.hadoop.hbase.master.TimeToLiveLogCleaner
如果开启了replication,还会执行hadoop.hbase.replication.master.ReplicationLogCleaner
当replication处理完一个Hlog后会删除Zookeeper上的hlog节点,ReplicationLogCleaner会默认每60扫描( 60s int cleanerInterval = conf.getInt("hbase.master.cleaner.interval", 60 * 1000)).oldlogs目录中的每个一个hlog, 检查ZK是否已经删除,如果ZK上已经不存在该Hlog,则会从物理上直接删除该hlog
在实际Master启动时,执行逻辑的是
Hmaster.run()->
Hmaster.finishInitialization()->
startServiceThreads()->执行下面的代码就是初始化HFileCleaner和LogCleaner
//start the hfile archive cleaner thread
LOG.info("INIT HFILE cleaner");
Path archiveDir = HFileArchiveUtil.getArchivePath(conf);
this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf, getMasterFileSystem()
.getFileSystem(), archiveDir);
Threads.setDaemonThreadRunning(hfileCleaner.getThread(), n + ".archivedHFileCleaner");
LOG.info("INIT Hlog cleaner");
this.logCleaner =
new LogCleaner(cleanerInterval,
this, conf, getMasterFileSystem().getFileSystem(),
getMasterFileSystem().getOldLogDir());
Threads.setDaemonThreadRunning(logCleaner.getThread(), n + ".oldLogCleaner");
最终在CleanerChore类中执行 initCleanerChain(confKey)完成初始化。
private void initCleanerChain(String confKey) {
this.cleanersChain = new LinkedList<T>();
LOG.info(" initCleanerChain Start" );
String[] logCleaners = conf.getStrings(confKey); //confkey=hbase.master.logcleaner.plugins or hbase.master.hfilecleaner.plugins
if (logCleaners != null) {
for (String className : logCleaners) {
LOG.info(" initCleanerChain:"+ className );
T logCleaner = newFileCleaner(className, conf);
if (logCleaner != null) this.cleanersChain.add(logCleaner);
}
}
}
public static final String TTL_CONF_KEY = "hbase.master.hfilecleaner.ttl";
// default ttl = 5 minute
private static final long DEFAULT_TTL = 60000 * 5;
Hfile的cleaner 配置项
hbase.master.hfilecleaner.plugins
默认:org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner
hbase.master.hfilecleaner.ttl";
默认: 60000 * 5; 5分钟
Hlog cleaner 配置项
hbase.regionserver.optionallogflushinterval
将Hlog同步到HDFS的间隔。如果Hlog没有积累到一定的数量,到了时间,也会触发同步。默认是1秒,单位毫秒。
默认: 1000
hbase.regionserver.logroll.period
提交commit log的间隔,不管有没有写足够的值。
默认: 3600000 (1个小时)
hbase.master.logcleaner.ttl
Hlog存在于.oldlogdir 文件夹的最长时间, 超过了就会被 Master 的线程清理掉.
默认: 600000 (10分钟)
hbase.master.logcleaner.plugins
值用逗号间隔的文本表示。这些WAL/HLog cleaners会按顺序调用。可以把先调用的放在前面。可以实现自己的LogCleanerDelegat,加到Classpath下,然后在这里写上类的全路径就可以。一般都是加在默认值的前面。
具体的初始是在CleanerChore 的initCleanerChain方法,此方法同时也实现HFile的cleaner的初台化。
默认: org.apache.hadoop.hbase.master.TimeToLiveLogCleaner
hbase.regionserver.hlog.blocksize
hbase.regionserver.maxlogs
WAL的最大值由hbase.regionserver.maxlogs * hbase.regionserver.hlog.blocksize (2GB by default)决定。一旦达到这个值,Memstore flush就会被触发。通过WAL限制来触发Memstore的flush并非最佳方式,这样做可能会会一次flush很多Region,引发flush雪崩。
最好将hbase.regionserver.hlog.blocksize * hbase.regionserver.maxlogs 设置为稍微大于hbase.regionserver.global.memstore.lowerLimit * HBASE_HEAPSIZE.