`
brianf
  • 浏览: 37330 次
  • 来自: 杭州
社区版块
存档分类
最新评论

flush后split和compact后split

阅读更多
什么时候split?
当某store所有文件总大小大于某个值时split,注意,并不是判断某个storefile大小大于某个值。
什么时候compact?
检查整个region内所有store中任一个store 的总storefile是不是太多了(大于hbase.hstore.blockingStoreFiles(7)),太多了则会先进行compact。

flush会遍历这个region的所有store,并一个个执行。
compact遍历这个region找到符合条件的store进行compact.


1. 在flush之后会判断是否需要split和compact
这里的split有一个判断条件,先计算这tableRegionsCount(regionserver上的这个table的online的region个数),
然后循环计算此region的所有store是否太大,这是通过getSizeToCheck方法计算出一个size,若当前的store总大小大于这个值,则表示此region需要split.

getSizeToCheck的计算方法首先判断tableRegionsCount是否等于0,若是则返回hbase.hregion.max.filesize ,若不是,则计算Math.min(getDesiredMaxFileSize(),
        this.flushSize * (tableRegionsCount * tableRegionsCount)。

      boolean shouldCompact = region.flushcache();
      // We just want to check the size
      boolean shouldSplit = region.checkSplit() != null;
      if (shouldSplit) {
        this.server.compactSplitThread.requestSplit(region);
      } else if (shouldCompact) {
        server.compactSplitThread.requestCompaction(region, getName());
      }



  private long flushSize;

  @Override
  protected void configureForRegion(HRegion region) {
    super.configureForRegion(region);
    this.flushSize = region.getTableDesc() != null?
      region.getTableDesc().getMemStoreFlushSize():
      getConf().getLong(HConstants.HREGION_MEMSTORE_FLUSH_SIZE,
        HTableDescriptor.DEFAULT_MEMSTORE_FLUSH_SIZE);
  }

  @Override
  protected boolean shouldSplit() {
    if (region.shouldForceSplit()) return true;
    boolean foundABigStore = false;
    // Get count of regions that have the same common table as this.region
    int tableRegionsCount = getCountOfCommonTableRegions();
    // Get size to check
    long sizeToCheck = getSizeToCheck(tableRegionsCount);

    for (Store store : region.getStores().values()) {
      // If any of the stores is unable to split (eg they contain reference files)
      // then don't split
      if ((!store.canSplit())) {
        return false;
      }

      // Mark if any store is big enough
      long size = store.getSize();
      if (size > sizeToCheck) {
        LOG.debug("ShouldSplit because " + store.getColumnFamilyName() +
          " size=" + size + ", sizeToCheck=" + sizeToCheck +
          ", regionsWithCommonTable=" + tableRegionsCount);
        foundABigStore = true;
        break;
      }
    }

    return foundABigStore;
  }

  /**
   * @return Region max size or <code>count of regions squared * flushsize, which ever is
   * smaller; guard against there being zero regions on this server.
   */
  long getSizeToCheck(final int tableRegionsCount) {
    return tableRegionsCount == 0? getDesiredMaxFileSize():
      Math.min(getDesiredMaxFileSize(),
        this.flushSize * (tableRegionsCount * tableRegionsCount));
  }

  /**
   * @return Count of regions on this server that share the table this.region
   * belongs to
   */
  private int getCountOfCommonTableRegions() {
    RegionServerServices rss = this.region.getRegionServerServices();
    // Can be null in tests
    if (rss == null) return 0;
    byte [] tablename = this.region.getTableDesc().getName();
    int tableRegionsCount = 0;
    try {
      List<HRegion> hri = rss.getOnlineRegions(tablename);
      tableRegionsCount = hri == null || hri.isEmpty()? 0: hri.size();
    } catch (IOException e) {
      LOG.debug("Failed getOnlineRegions " + Bytes.toString(tablename), e);
    }
    return tableRegionsCount;
  }


2. compact后split
CompactionRequest.run中,compact完成之后,若完成了compact,则继续判断是否需要compact,判断的依据是if (s.getCompactPriority() <= 0) 表示7减去当前storefile的文件数是否<=0,也就是还有许多文件需要compact。
否则则进行split,在CompactSplitThread.requestSplit中,if (shouldSplitRegion() && r.getCompactPriority() >= PRIORITY_USER) ,首先判断系统设置的hbase.regionserver.regionSplitLimit(此参数可以限制整个系统总的region数)总region数是否大于当前在线的region数,若大于就不会split,再判断是否有这个region所有store中7-文件数>=1的store,两者都符合则split.

有一个疑问:难道不需要判断一下文件大小再split吗???

        boolean completed = r.compact(this);
        long now = EnvironmentEdgeManager.currentTimeMillis();
        LOG.info(((completed) ? "completed" : "aborted") + " compaction: " +
              this + "; duration=" + StringUtils.formatTimeDiff(now, start));
        if (completed) {
          server.getMetrics().addCompaction(now - start, this.totalSize);
          // degenerate case: blocked regions require recursive enqueues
          if (s.getCompactPriority() <= 0) {
            server.compactSplitThread
              .requestCompaction(r, s, "Recursive enqueue");
          } else {
            // see if the compaction has caused us to exceed max region size
            server.compactSplitThread.requestSplit(r);
          }
        }


  public synchronized boolean requestSplit(final HRegion r) {
    // don't split regions that are blocking
    if (shouldSplitRegion() && r.getCompactPriority() >= PRIORITY_USER) {
      byte[] midKey = r.checkSplit();
      if (midKey != null) {
        requestSplit(r, midKey);
        return true;
      }
    }
    return false;
  }


  private boolean shouldSplitRegion() {
    return (regionSplitLimit > server.getNumberOfOnlineRegions());
  }

    this.regionSplitLimit = conf.getInt("hbase.regionserver.regionSplitLimit",
        Integer.MAX_VALUE);


  public int getCompactPriority() {
    int count = Integer.MAX_VALUE;
    for(Store store : stores.values()) {
      count = Math.min(count, store.getCompactPriority());
    }
    return count;
  }



分享到:
评论

相关推荐

    HBase概述——HBase的存储模型.pdf

    Compact分为minor compact和major compact两种类型。前者主要合并小文件,后者则会整合所有文件,以优化存储并提高查询性能。然而,major compact会因全量读取而消耗大量IO资源,可能短暂影响查询效率。 此外,当...

    Hadoop之Hbase从入门到精通.docx

    大Region,则不太适合经常split和compaction,因为做一次compact和split会产生较长时间的停顿,对应用的读写性能冲击非常大。 HBase性能调优是一个非常复杂的过程,需要根据实际应用场景进行调整。通过调整...

    Hbase性能测试详细设计文档及用例.pdf

    其次, Compact与Split机制是HBase内部数据管理的核心。数据更新首先写入WAL日志和内存的MemStore,当MemStore达到阈值时,会触发flush操作,生成StoreFile。当StoreFile数量过多或大小超过阈值,系统会进行Major ...

    某大数据公司内部Hbase性能测试详细设计文档及用例

    当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对StoreFile进行分割(split),等分为...

    大数据开发之案例实践Hbase的设计及企业优化视频教程(视频+讲义+笔记+配置+代码+练习)

    │ Hbase性能优化-flush、compact、split │ Hbase性能优化-配置snappy压缩 │ Hbase中索引的介绍 │ PHoenix的编译及安装部署 │ PHoenix与Hbase表的关联使用 ├─03_笔记 │ [案例:Hbase的设计及企业优化].txt ├...

    hbase shell命令详解

    `flush '表名'`清空表的缓存,`compact '表名'`和`major_compact '表名'`分别是普通合并和大合并,用于优化存储空间。 以上只是HBase Shell常用的一些命令,实际上还有更多高级操作,如过滤器、性能调优等。熟练...

    星环大数据平台_Hyperbase基本用法.pdf

    compact命令和major_compact命令分别用于执行局部压缩和全局压缩操作,优化存储空间的利用。 6. 导出表属性到本地文件:使用describeInJson命令可以将当前表的属性导出为本地的JSON格式文件,方便进行进一步的分析...

    HBase大数据技术原理与实践.pptx

    当MemStore达到一定大小时,数据会被Flush到StoreFile,并在必要时进行Compact和Split操作。HLog作为WAL,保证数据在写入HBase前先写入日志,以防数据丢失。 HFile是HBase的存储格式,有V1、V2和V3三个版本,V2引入...

    Hbase shell常用命令.docx

    - **tools**:提供了一些实用工具命令,如`compact`(压缩)、`flush`(刷新缓存)和`split`(分裂region)等。 - **replication**:用于复制和管理HBase的复制流,包括`add_peer`、`remove_peer`等。 了解这些基本...

    大数据 76 道面试题及答案.docx

    3. Region的split和集群管理: Region的split是指将一个region分成多个region的过程。集群管理是通过ZooKeeper+hmaster+hregionserver来实现的。 4. 去掉Reduce阶段: 在某些场景下,去掉Reduce阶段可以提高计算...

    hadoop、habse、yarn、MapReduce调优等总结的集合调优.docx

    9. **flush、compact、split机制**:合理设置Memstore的阈值,控制数据刷新、合并和分割的操作,确保HBase的高效运行。 YARN调优涉及到的任务调度、资源分配等,如调整Container的大小、内存分配策略等,目的是最大...

Global site tag (gtag.js) - Google Analytics