`

hbase 定时进行compact CompactionChecker类

阅读更多

 CompactionChecker类 定时判断是否进行compact,

  定时判断间隔hbase.server.compactchecker.interval.multiplier默认1000

 @Override
    protected void chore() {
      for (HRegion r : this.instance.onlineRegions.values()) {
        if (r == null)
          continue;
        for (Store s : r.getStores().values()) {
          try {
            long multiplier = s.getCompactionCheckMultiplier();
            assert multiplier > 0;
            if (iteration % multiplier != 0) continue;
            if (s.needsCompaction()) {//compact判断
              // Queue a compaction. Will recognize if major is needed.
              this.instance.compactSplitThread.requestSystemCompaction(r, s, getName()
                  + " requests compaction");
            } else if (s.isMajorCompaction()) {//major判断
              if (majorCompactPriority == DEFAULT_PRIORITY
                  || majorCompactPriority > r.getCompactPriority()) {
                this.instance.compactSplitThread.requestCompaction(r, s, getName()
                    + " requests major compaction; use default priority", null);
              } else {
                this.instance.compactSplitThread.requestCompaction(r, s, getName()
                    + " requests major compaction; use configured priority",
                  this.majorCompactPriority, null);
              }
            }
          } catch (IOException e) {
            LOG.warn("Failed major compaction check on " + r, e);
          }
        }
      }
      iteration = (iteration == Long.MAX_VALUE) ? 0 : (iteration + 1);
    }
  }

  循环所有Store,

  定时判断循环次数 % 配置值 = 0 则不做操作

  

  否则进行判断needsCompaction,会调用策略类RatioBasedCompactionPolicy

       当store下的hfile个数>hbase.hstore.compaction.min,则进行compact

   public boolean needsCompaction(final Collection<StoreFile> storeFiles,
      final List<StoreFile> filesCompacting) {
    int numCandidates = storeFiles.size() - filesCompacting.size();
    return numCandidates >= comConf.getMinFilesToCompact();
  }
  

   若不需要compact,还会查看是否需要major compact,

  HStore检查是否进行compact时候,现在now - 上次major时间(加一个波动,防止restart集中marjor compact)大于hbase.hregion.majorcompaction下次时间间隔  

  满足上边条件,并且hfile个数大于1

  满足上边条件,并且只有一个hfile(最早的ts>ttl)整个文件过期 => 进行marjor compact

 

   public boolean isMajorCompaction(final Collection<StoreFile> filesToCompact)
      throws IOException {
    boolean result = false;
    long mcTime = getNextMajorCompactTime(filesToCompact);
    if (filesToCompact == null || filesToCompact.isEmpty() || mcTime == 0) {
      return result;
    }
    // TODO: Use better method for determining stamp of last major (HBASE-2990)
    long lowTimestamp = StoreUtils.getLowestTimestamp(filesToCompact);
    long now = System.currentTimeMillis();
    if (lowTimestamp > 0l && lowTimestamp < (now - mcTime)) {
      //现在now - 上次major时间(加一个波动,防止restart集中marjor compact)大于hbase.hregion.majorcompaction下次时间间隔 
      // Major compaction time has elapsed.
      long cfTtl = this.storeConfigInfo.getStoreFileTtl();//
      if (filesToCompact.size() == 1) {
        // Single file
        StoreFile sf = filesToCompact.iterator().next();
        Long minTimestamp = sf.getMinimumTimestamp();
        long oldest = (minTimestamp == null)
            ? Long.MIN_VALUE
            : now - minTimestamp.longValue();
        if (sf.isMajorCompaction() &&
            (cfTtl == HConstants.FOREVER || oldest < cfTtl)) {
          if (LOG.isDebugEnabled()) {
            LOG.debug("Skipping major compaction of " + this +
                " because one (major) compacted file only and oldestTime " +
                oldest + "ms is < ttl=" + cfTtl);
          }
        } else if (cfTtl != HConstants.FOREVER && oldest > cfTtl) {
        	//只有一个hfile(最早的ts>ttl)整个文件过期 => 进行marjor compact
          LOG.debug("Major compaction triggered on store " + this +
            ", because keyvalues outdated; time since last major compaction " +
            (now - lowTimestamp) + "ms");
          result = true;
        }
      } else {//hfile个数大于1个
        if (LOG.isDebugEnabled()) {
          LOG.debug("Major compaction triggered on store " + this +
              "; time since last major compaction " + (now - lowTimestamp) + "ms");
        }
        result = true;
      }
    }
    return result;
  }

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    hbasesink 自定义序列化类

    hbasesink 自定义序列化类 ,可实现自定义rowkey及去除字段两边索引,具体请看下代码。 hbasesink 自定义序列化类 ,可实现自定义rowkey及去除字段两边索引,具体请看下代码。

    hbase数据可视化系统

    4. 实体类映射:为HBase的表和列族创建Java实体类,使用注解进行映射。 四、搭建HBase可视化界面 1. 页面设计:使用Thymeleaf、Freemarker或其他模板引擎,创建页面布局,设计表单和数据显示区域。 2. 控制器编写...

    HbaseTemplate 操作hbase

    这是一个封装了HBase操作的模板类,简化了Java开发人员与HBase交互的复杂性。通过HbaseTemplate,我们可以执行常见的CRUD(创建、读取、更新和删除)操作以及更复杂的查询。 1. **HbaseTemplate的初始化**:在使用...

    hbase- java开发连接工具类

    在这个“hbase-java开发连接工具类”中,包含了一个1.2.1版本的`hbase-client.jar`,这是与HBase通信的核心库。 `hbase-client.jar`包含了以下关键组件和功能: 1. **HBase客户端API**:Java开发者可以通过这个API...

    hbase表操作工具类

    hbase表操作工具类.连接hbase数据库,根据rowkey删除单条记录,批量删除记录。获取某个字段的值,判断记录是否存在,向hbase表中插单条数据,批量插入到hbase表。 查询表,获取某个字段的值列表,hbase工具

    Java操作Hbase进行建表、删表以及对数据进行增删改查

    Java 操作 Hbase 进行建表、删表以及对数据进行增删改查 一、Hbase 简介 Hbase 是一个开源的、分布式的、基于 column-family 的 NoSQL 数据库。它是基于 Hadoop 的,使用 HDFS 作为其存储层。Hbase 提供了高性能、...

    HBase源代码 hbase-0.98.23

    《深入剖析HBase源代码:hbase-0.98.23》 ...这对于理解HBase的工作原理,优化系统性能,甚至进行二次开发具有极大的价值。然而,HBase的复杂性和深度意味着这只是冰山一角,更多的知识等待着开发者去探索和挖掘。

    hbase 数据库

    12. **安全配置**:在生产环境中,可能需要配置HBase与Kerberos进行集成,以实现身份验证和授权,保障数据安全。 通过以上步骤,你可以在本地或集群环境中成功安装并运行HBase。理解并熟练掌握这些知识点,对于管理...

    HBase Java API类介绍

    HBase提供了Java API供开发者使用,以便更方便地与HBase进行交互。本文将详细介绍HBase Java API中的几个核心类及其功能。 #### 二、HBase Java API类介绍 ##### 1. HBaseConfiguration **关系**:`org.apache....

    Hadoop+HBase+Java API

    HBase利用Hadoop的HDFS作为底层存储,通过Zookeeper进行协调和服务发现,提供强一致性和高并发性能。 **Java API** 是Java编程语言提供的应用程序接口,允许开发者使用Java来访问和操作Hadoop和HBase的功能。对于...

    hbase用于查询客户端工具

    在HBase环境中,有多种客户端工具可供开发人员和管理员使用来进行查询和其他操作。以下是一些主要的HBase查询客户端工具及其详细说明: 1. **HBase Shell**:这是HBase自带的一个命令行接口,用户可以通过Java REPL...

    Hbase权威指南(HBase: The Definitive Guide)

    - **MapReduce集成**:HBase支持MapReduce任务直接对存储在HBase中的数据进行处理,这大大简化了数据处理流程,提高了效率。 #### 四、HBase的关键特性 - **可扩展性**:HBase能够轻松地扩展到数百甚至数千台服务器...

    HBase官方文档中文版-HBase手册中文版

    3. Hive集成:通过Hive的HBase存储过程进行数据查询。 4. Flume、Kafka集成:用于日志收集和实时流处理。 这份“HBase官方文档中文版”详细阐述了HBase的核心概念、架构、操作以及最佳实践,对于HBase的学习者和...

    hbase配置内置的zookeeper

    通常情况下,HBase 可以与独立的 ZooKeeper 服务进行集成,但为了简化部署过程,特别是对于小型测试环境或开发环境,我们可以选择配置 HBase 内置的 ZooKeeper。 #### 二、配置步骤详解 ##### 1. 准备阶段 首先...

    hbase jar包.zip

    "hbase jar包.zip" 提供了整合Spring与HBase所需的关键库文件,使得开发者能够高效地利用Spring进行HBase的操作。接下来,我们将深入探讨这些库文件的作用和功能,以及它们如何支持Spring集成HBase。 首先,hbase-...

    pinpoint的hbase初始化脚本hbase-create.hbase

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    hbase安装包

    1. 面向列:与传统关系型数据库不同,HBase是以列族(Column Family)为单位存储数据的,这使得对某一类数据进行快速访问成为可能。 2. 分布式:HBase通过分区(Region)将数据分散在多台服务器上,可以水平扩展,...

    基于springboot集成hbase过程解析

    HBaseTemplate是SpringBoot提供的一个模板类,用于简化HBase的操作。下面是一个使用HBaseTemplate的示例: ```java @Service @Slf4j public class HBaseService { @Autowired private HbaseTemplate hbase...

    hbase-2.4.17-bin 安装包

    3. 对HBase进行定期备份,以防数据丢失。 总结来说,HBase-2.4.17-bin安装包提供了一个强大且高效的NoSQL数据库,适合大数据场景下的实时读写操作。通过理解并掌握上述概念、安装步骤及操作方法,用户可以有效地...

    HBase学习利器:HBase实战

    HBase是Apache Hadoop生态系统中的一个分布式、可扩展的列族数据库,它提供了类似Bigtable的能力,能够在大规模数据集上进行随机读写操作。HBase是基于Hadoop Distributed File System (HDFS)构建的,能够处理PB级别...

Global site tag (gtag.js) - Google Analytics