`
standalone
  • 浏览: 613055 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hbase中region的flush

阅读更多

都知道memstore大小到一定程度后会flush到disk上去,这个大小是由hbase.hregion.memstore.flush.size定义的。flush的时候也不是说马上就flush出去,会有个检查,就是下面这个方法了:

 

code:hbase 0.20.6, MemStoreFlusher.java

 

 /*
   * A flushRegion that checks store file count.  If too many, puts the flush
   * on delay queue to retry later.
   * @param fqe
   * @return true if the region was successfully flushed, false otherwise. If 
   * false, there will be accompanying log messages explaining why the log was
   * not flushed.
   */
  private boolean flushRegion(final FlushQueueEntry fqe) {
    HRegion region = fqe.region;
    if (!fqe.region.getRegionInfo().isMetaRegion() &&
        isTooManyStoreFiles(region)) {
      if (fqe.isMaximumWait(this.blockingWaitTime)) {
        LOG.info("Waited " + (System.currentTimeMillis() - fqe.createTime) +
          "ms on a compaction to clean up 'too many store files'; waited " +
          "long enough... proceeding with flush of " +
          region.getRegionNameAsString());
      } else {
        // If this is first time we've been put off, then emit a log message.
        if (fqe.getRequeueCount() <= 0) {
          // Note: We don't impose blockingStoreFiles constraint on meta regions
          LOG.warn("Region " + region.getRegionNameAsString() + " has too many " +
            "store files; delaying flush up to " + this.blockingWaitTime + "ms");
        }
        this.server.compactSplitThread.compactionRequested(region, getName());
        // Put back on the queue.  Have it come back out of the queue
        // after a delay of this.blockingWaitTime / 100 ms.
        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));
        // Tell a lie, it's not flushed but it's ok
        return true;
      }
    }
    return flushRegion(region, false);
  }

这个code逻辑是:

1. 如果是meta region,没话说,立即flush出去吧,因为meta region优先级高啊;

2. 如果是user的region,先看看是不是有太多的StoreFile了,这个storefile就是每次memstore flush造成的,flush一次,就多一个storefile,所以一个HStore里面会有多个storefile(其实就是hfile)。判断多不多的一个阈值是由hbase.hstore.blockingStoreFiles定义的;

 

Note:要弄清楚的就是,Hbase将table水平划分成Region,region按column family划分成Store,每个store包括内存中的memstore和持久化到disk上的HFile。

 

还有一个check flush的地方,就是HRegion里面

 

 /*
   * Check if resources to support an update.
   *
   * Here we synchronize on HRegion, a broad scoped lock.  Its appropriate
   * given we're figuring in here whether this region is able to take on
   * writes.  This is only method with a synchronize (at time of writing),
   * this and the synchronize on 'this' inside in internalFlushCache to send
   * the notify.
   */
  private void checkResources() {

    // If catalog region, do not impose resource constraints or block updates.
    if (this.getRegionInfo().isMetaRegion()) return;

    boolean blocked = false;
    while (this.memstoreSize.get() > this.blockingMemStoreSize) {
      requestFlush();
      if (!blocked) {
        LOG.info("Blocking updates for '" + Thread.currentThread().getName() +
          "' on region " + Bytes.toStringBinary(getRegionName()) +
          ": memstore size " +
          StringUtils.humanReadableInt(this.memstoreSize.get()) +
          " is >= than blocking " +
          StringUtils.humanReadableInt(this.blockingMemStoreSize) + " size");
      }
      blocked = true;
      synchronized(this) {
        try {
          wait(threadWakeFrequency);
        } catch (InterruptedException e) {
          // continue;
        }
      }
    }
    if (blocked) {
      LOG.info("Unblocking updates for region " + this + " '"
          + Thread.currentThread().getName() + "'");
    }
  }

这里的memstoreSize是一个region中所有memstore的总大小,blockingMemStoreSize计算的公式如下:

blockingMemStoreSize=hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier

就是说,对整个HRegion来说,所有memstore的总大小大于multiplier个memstore阈值的时候,就开始阻止客户端的更新了,这样是为了避免内存中的数据太多吧。

分享到:
评论

相关推荐

    HBASERegion数量增多问题描述及解决方案.docx

    【HBASERegion数量增多问题描述及解决方案】 在HBase分布式数据库中,Region是表数据的基本存储单元,它将表的数据按照ROWKEY的范围进行分割。随着数据的增长,一个Region会分裂成两个,以此来确保数据的均衡分布。...

    HBase源码分析

    在HBase中,客户端和服务器之间的通信主要通过IPC(Inter-Process Communication)和RPC(Remote Procedure Call)进行。HBase采用了自定义的RPC服务框架,名为HBaseRPC。这个框架由多个组件构成,包括RPCServer和...

    hbase-1.2.6-bin.tar.gz

    4. **实时查询**:HBase支持实时的读写操作,这得益于其内存中的数据模型和即时的数据flush机制。 5. **索引与查询优化**:虽然HBase不是关系型数据库,但仍然提供了索引功能,例如,可以使用Secondary Index进行...

    HBase性能深度分析

    伴随数据写入,内存中的数据达到由“hbase.hregion.memstore.flush.size”参数控制的阈值(默认64MB)时,会被写入到region文件中。当region文件大小达到由“hbase.hregion.max.filesize”参数决定的上限(默认256MB...

    大数据HBASE考题材料

    HBase中的行键按照二进制顺序进行排序,这种排序方式是从左到右逐字节比较的,这种方式确保了数据的高效检索和排序。 3. **HBase的数据存储基础** HBase构建在Hadoop的HDFS之上,这意味着HBase利用HDFS来存储其...

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

    在HBase中,默认情况下,在创建表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这个region写数据,直到这个region足够大了才进行切分。为了加快批量写入速度,可以通过预先创建一些空的...

    Hbase运维手册范本.doc

    Region 的数量和每台 RegionServer 上的 Region 数是 HBase 运维中需要检查的重要指标。通过检查 Region 的数量,可以了解 HBase 集群的整体情况,从而进行相应的优化和调整。 2. 缓存命中率 缓存命中率是 HBase ...

    HBase配置项说明及调优建议.zip

    在大数据存储领域,HBase作为一个分布式列式数据库,被广泛应用于处理海量结构化数据。...这份资料中的“HBase配置项说明及调优建议.xlsx”应该包含了详细的参数解释和实践案例,是学习和优化HBase不可或缺的参考资源。

    大数据技术之HBase的面试题.zip

    5. **HBase的Region分裂**: - 当Region大小超过预设阈值时,Region会被分裂成两个新的Region。 - 这个过程由HMaster监控和执行,以保持负载均衡。 6. **HBase与Hadoop的关系**: - HBase运行在HDFS之上,利用...

    hbase资料_hbase-default.xml.zip

    1. **HBase元数据存储**:HBase的元数据存储在HBase的Meta表中,这些信息包括表名、列族、Region位置等。`hbase.rootdir`配置项定义了HDFS上的目录,用于存储HBase的数据和元数据。 2. **RegionServer配置**:`...

    Hbase

    1. **Region分裂**:当某个`Region`中的`StoreFiles`大小超过`hbase.hregion.max.filesize`设置值时,该`Region`会被分裂成两个新的`Region`。分裂过程中,新的`Region`指向旧`Region`的`StoreFiles`的不同部分。 2....

    HBase参数修改 PDF 下载

    HBase的参数主要分布在`hbase-site.xml`和`hbase-default.xml`两个配置文件中。`hbase-site.xml`用于覆盖默认配置,而`hbase-default.xml`则包含了所有可能的配置项及其默认值。 三、关键参数详解 1. `hbase....

    HBase文档

    - **Region**:数据被划分为多个Region,每个Region包含一个或多个列族,是HBase中的基本管理单元。 - **StoreFile**:Region中的数据存储为多个StoreFile文件,它们是不可变的,只读的HFile格式文件。 - **MemStore...

    hbase 1.2.0源码

    1. 表与Region:HBase中的数据存储在表中,每个表由多个Region组成。Region是表的物理分割,根据行键(Row Key)的排序分配到不同的Region服务器上,确保数据的分布均匀。 2. Region服务器:Region服务器是HBase的...

    HBASE基础应用的介绍

    Region是HBase表中的一种逻辑划分,每个Region包含一定数量的列族(Column Family)。 2. **HRegion**:它是HBase表的基本分区单位,每个Region包含了一个或多个Store,每个Store对应于一个列族。 3. **Store**:Store...

    深入学习hbase原理资料整理

    在HBase的生命周期中,当Region的MemStore达到一定大小后,会触发flush操作,此时内存中的数据将被写入HLog,随后形成一个新的HFile存储在HDFS上。这个过程确保了即使在RegionServer宕机的情况下,数据也不会丢失,...

    hbase性能调优

    - 当StoreFile数量超过该值时,新数据将先进行Split或Compaction,以避免MemStore因等待Flush而导致写入操作被阻塞。 ##### 6. `hbase.regionserver.global.memstore.upperLimit` 和 `hbase.regionserver.global....

    HBase官网文档解读.pdf

    文档中的每个章节都提供了足够的细节,旨在帮助用户从零开始深入了解HBase,并能够应对实际工作中的各种问题。 2. HBase的安装模式 HBase提供了三种安装模式,分别是独立模式(Standalone)、伪分布式模式(Pseudo-...

    HBase写性能优化策略

    Region是HBase中进行数据分布和负载均衡的单位,如果当前集群中表的Region数量少于RegionServer的数量,那么可以考虑对Region进行切分,并尽量分配到不同的RegionServer上,以此提高系统的并发处理能力。然而,如果...

Global site tag (gtag.js) - Google Analytics