`
lc_koven
  • 浏览: 353313 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多region下的hbase写入问题

阅读更多
    最近在集群上发现hbase写入性能受到较大下降,测试环境下没有该问题产生。而生产环境和测试环境的区别之一是生产环境的region数量远远多于测试环境,单台regionserver服务了约3500个region。
    通过jstack工具检查到大半写入线程BLOCKED状态在"public synchronized void reclaimMemStoreMemory() {"这一行,这是在put之前的一个检查过程。
    hbase在每次put以前,需要检查当前regionserver上的memstore是否超过总memstore阀值,如果超过,需要block住当前的写入,防止OOM,代码片段见下:
/**
   * Check if the regionserver's memstore memory usage is greater than the
   * limit. If so, flush regions with the biggest memstores until we're down
   * to the lower limit. This method blocks callers until we're down to a safe
   * amount of memstore consumption.
   */
  public synchronized void reclaimMemStoreMemory() {
    if (isAboveHighWaterMark()) {
      lock.lock();
      try {
        while (isAboveHighWaterMark() && !server.isStopped()) {
          wakeupFlushThread();
          try {
            // we should be able to wait forever, but we've seen a bug where
            // we miss a notify, so put a 5 second bound on it at least.
            flushOccurred.await(5, TimeUnit.SECONDS);
          } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
          }
        }
      } finally {
        lock.unlock();
      }
    } else if (isAboveLowWaterMark()) {
      wakeupFlushThread();
    }
  }

    这是一个同步操作,其中isAboveHighWaterMark()的代码如下:
  private boolean isAboveHighWaterMark() {
    return server.getGlobalMemStoreSize() >= globalMemStoreLimit;
  }

    getGlobalMemStoreSize()里面的操作是遍历所有region,拿到每个region的memstore大小:
  public long getGlobalMemStoreSize() {
    long total = 0;
    for (HRegion region : onlineRegions.values()) {
      total += region.memstoreSize.get();
    }
    return total;
  }

    如果region数量很多就比较杯具了,在单台服务器3500个region的环境下通过btrace跟踪到这一步需要耗时0.4ms,也就是每一个put会block所有线程0.4ms,这样无法发挥出server端并行处理能力,同时可以计算出无论如何配置,写tps无法超过1000/0.4=2500!
    产生这个问题的根本原因是在0.90.x版本中,region无法拿到regionserver的信息,因此只能通过实时计算来得到rs上总的memstore大小。在0.92.0或trunk版本中修改了HRegion的数据结构,让HRegion在初始化时得到regionserver的信息,因此可以实时记录memstore的总大小,并让每个region对象能拿到该值,于是这个isAboveHighWaterMark()就不再block住所有线程了,在region较多的场景下写性能得到较大提升。
    参照https://issues.apache.org/jira/browse/HBASE-3694,可以以此patch为参考生成相应的0.90.x版本的patch
5
5
分享到:
评论
11 楼 xGss2000 2014-09-23  
要是减少到300个 region,block就0.04s了。
话说3000多个region?多大的memstore? 好大的内存。。。。
lc_koven 写道
杨俊华 写道
有没有考虑增大Region的大小。
3000个region太多了。
机器的内存多大?一个Region的大小是多少?

产生这个问题跟region大小无关,即使空region也能复现同样的问题。有的用户在实际生产中确实需要使用多个region,增加region可以减少应用的复杂度。

10 楼 lc_koven 2011-09-13  
bupt04406 写道
庄哥厉害,btrace怎么去跟踪运行时间的?

google之
9 楼 lc_koven 2011-09-13  
sunny96 写道
一个RS上的region不能够太多,如果太多会导致产生大大量小Hfile,增加compaction的压力。

这个是用户应用决定,我们无法控制。不过region数目跟compaction有什么联系呢?compact的触发条件是同一个region内数目达到一定数量,而跟region本身的数目无关。而且只要hdfs足够大,compact的影响可以忽略了。
8 楼 sunny96 2011-09-12  
一个RS上的region不能够太多,如果太多会导致产生大大量小Hfile,增加compaction的压力。
7 楼 bupt04406 2011-08-16  
庄哥厉害,btrace怎么去跟踪运行时间的?
6 楼 lc_koven 2011-08-16  
杨俊华 写道
有没有考虑增大Region的大小。
3000个region太多了。
机器的内存多大?一个Region的大小是多少?

产生这个问题跟region大小无关,即使空region也能复现同样的问题。有的用户在实际生产中确实需要使用多个region,增加region可以减少应用的复杂度。
5 楼 杨俊华 2011-08-16  
有没有考虑增大Region的大小。
3000个region太多了。
机器的内存多大?一个Region的大小是多少?
4 楼 yiihsia 2011-08-11  
有理有据,令人性福
3 楼 lc_koven 2011-08-11  
QiaoDuanni 写道
打了patch后的性能怎么样?

目前还在测试,不过在上述应用场景中,将region数目降到1000个/台,其它不变。tps翻了三倍
2 楼 QiaoDuanni 2011-08-11  
完全不理解这些踩的人啊.
1 楼 QiaoDuanni 2011-08-11  
打了patch后的性能怎么样?

相关推荐

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

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

    多线程 hbase

    三、示例:多线程HBase写入 创建一个线程池,每个任务负责写入一批记录到HBase。每个任务先构建`Put`对象,然后在主线程中提交到`HTable`,以批量写入的方式提高效率。同时,确保每个线程在执行写入前获取`HTable`的...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...

    Hbase调用JavaAPI实现批量导入操作

    - 合理配置HBase:调整HBase的Region大小,负载均衡,以及写入缓冲区等参数,优化导入性能。 6. **错误处理和重试机制**: 在批量导入过程中,可能会遇到网络异常、Region Server故障等问题,因此需要实现错误...

    HBase写性能优化策略

    首先,要理解HBase写入数据的基本流程:数据首先顺序写入到HLog(WAL),这是一个写入操作的日志文件,用以确保数据的持久化和系统的容错能力。然后数据被写入到对应的缓存Memstore中,当Memstore中数据达到一定阈值...

    HBase多表关联查找资料

    * bloomfilter:根据应用需求,判断是否需要精确到 rowkey 或 column, bloomfilter 可以对 region 下的 hfile 进行查询优化。 2. rowkey 设计 rowkey 是 HBase 的 key-value 存储中的 key,通常使用用户要查询的...

    HBase权威指南中文版

    这本书旨在帮助读者理解和掌握如何有效地使用HBase处理大规模数据存储和检索问题。HBase是建立在Apache Hadoop之上,一个面向列的、分布式的、可扩展的开源数据库,它能够提供实时的数据访问,并且具有强大的数据...

    hbase-2.0.0 linux软件包

    3. **表和Region管理**:表被分割成多个Region,Region是HBase中数据存储的基本单元。随着数据量增长,Region会自动分裂以保持良好的性能。 4. **版本化**:HBase支持多版本,这意味着对于同一行同一列的不同时间点...

    hbase的hbase-1.2.0-cdh5.14.2.tar.gz资源包

    4. **列(Column)**:每个列族下可以有多个列,列由列族名加上列限定符(Qualifier)组成,列限定符是可变的,用于区分同一列族内的不同列。 5. **版本(Version)**:HBase支持多版本,每个单元格都可以有多个版本...

    hbase1.0.3_part2

    HBase通过Region Split来解决这个问题,将大的Region分割成两个较小的部分,确保数据分布均匀。Split过程是透明的,对上层应用无感知。 2. **表的预分区**:为了优化数据写入,开发者可以在创建表时预先定义Region...

    HBase源代码 hbase-0.98.23

    例如,`org.apache.hadoop.hbase.regionserver.HStore`类实现了MemStore和BlockCache,它们分别缓存内存中的新写入数据和硬盘上的热数据,提高读写效率。同时,HBase还支持Compaction操作,通过`org.apache.hadoop....

    HBASE基础应用的介绍

    2. **HRegion**:它是HBase表的基本分区单位,每个Region包含了一个或多个Store,每个Store对应于一个列族。 3. **Store**:Store是Region内部的一个逻辑单元,用于存储特定列族的数据。每个Store又由一个MemStore和...

    HBase源码分析

    《深入剖析HBase源码:理解其...理解这些核心机制对于优化HBase性能、排查问题以及进行二次开发都至关重要。通过对HBase源码的深入学习,我们可以更好地掌握其工作原理,从而更好地利用HBase处理大规模的非结构化数据。

    hbase的rowkey设计与hbase的协处理器运用.docx

    5. 高可靠性:WAL 机制保证了数据写入时不会因集群异常而导致写入数据丢失,Replication 机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。 6. 高性能:底层的 LSM 数据结构和 Rowkey 有序排列等架构上的...

    hbase-1.3.1-bin.zip

    - 数据被分片到多个Region,每个Region由一个Region Server管理,Region可以动态分裂和合并。 3. **列族和行键** - HBase以行键(Row Key)为唯一标识,数据按行键排序存储。 - 数据按照列族(Column Family)...

    HBase的性能优化

    HBase的RegionServer处理器数量直接影响着写入性能。默认情况下,HBase的RegionServer处理器数量为10,可以根据实际情况调整这个值。例如,将Handler Count设置为100,可以明显提高写入性能。 调整HFile Block ...

    HBase性能深度分析

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

    java大数据作业_3HBase

    HBase中数据写入最后导致Region分裂的全过程 当HBase中的数据量增长到一定程度时,Region会被分裂。这一过程包括以下几个步骤: 1. **写入数据**:首先,客户端向RegionServer发送数据写入请求。 2. **写入...

    行业分类-设备装置-一种应用于HBASE数据库的数据写入方法及系统.zip

    这可能包含如何优化数据写入流程,提高系统的性能和稳定性,以及如何处理大数据量下的并发写入问题。 由于标签为空,我们无法从标签中获取额外信息,但可以推测文件内容可能会涵盖以下关键知识点: 1. **HBase概述...

    hbase 1.2.0源码

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

Global site tag (gtag.js) - Google Analytics