HBase HFile和Hlog的cleaner执行流程和配置项

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.

猜你喜欢

转载自brianf.iteye.com/blog/1884885