当前位置:首页 > 开发 > 开源软件 > 正文

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

发表于: 2013-06-09   作者:brianf   来源:转载   浏览次数:
摘要: HFile和Hlog是HBase中两大文件存在格式,HFile用于存储数据,Hlog用于保证数据写入HFile中。 两者都有自己的cleaner逻辑。HFileCleaner和LogCleaner都是继承CleanerChore类 public class HFileCleaner extends CleanerChore<BaseHFileCleanerDelegate> pu
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.

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
HLog的全部实现在包: org.apache.hadoop.hbase.regionserver.wal 中 相关的配置为 参数名 默认值 含
HLog的全部实现在包: org.apache.hadoop.hbase.regionserver.wal 中 相关的配置为 参数名 默认值 含
一. HLog在HDFS上位置和RegionServer对应关系 HLog持久化在HDFS之上, HLog存储位置查看: hadoop fs
HFile的整体结构图如下: 整个HFile分四部分: 1.可以被迭代器扫描的部分,如数据块 2.不被迭代器扫描
HFile的整体结构图如下: 整个HFile分四部分: 1.可以被迭代器扫描的部分,如数据块 2.不被迭代器扫描
what is every db holds its storage level,either memory or fs.this is similar to,hbase,it has
HBase put数据时会先将数据写入内存,其内存结构是一个ConcurrentSkipListMap,其Comparator是KVCom
写入数据: public class TestWrit { private static Configuration cfg = new Configuration(); pri
写入数据: public class TestWrit { private static Configuration cfg = new Configuration(); pri
1.HFile详解 HFile文件分为以下六大部分 序号 名称 描述 1 数据块 由多个block(块)组成,每个块的格
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号