`
lc_koven
  • 浏览: 349433 次
  • 性别: 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后的性能怎么样?

相关推荐

    java大数据作业_3HBase

    2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase shell是基于哪种JVM运行的语言实现的 6. ...

    Hbase 二级索引方案

    在 Hbase 中,表的 RowKey 按照字典排序, Region 按照 RowKey 设置 split point 进行 shard, 通过这种方式实现的全局、分布式索引. 成为了其成功的最大的砝码。 然而单一的通过 RowKey 检索数据的方式,不再满足更多...

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

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

    关于hbase性能调优文档.docx

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

    HBase的预分区

    这个region的rowkey是没有边界的,即没有start key和end key,在数据写入时,所有数据都会写入这个默认的region,随着数据量的不断增加,region的size越来越大时,大到一定的阀值,hbase认为再往这个region里塞数据...

    HBase优化实战

    本文来自于cnblogs,介绍了Rowkey设计问题,Region重分布,HDFS写入超时,网络拓扑,JVM参数调整等。Datastream一直以来在使用HBase分流日志,每天的数据量很大,日均大概在80亿条,10TB的数据。对于像Datastream...

    HBase架构核心模块

    HRegionServer负责打开region,并创建HRegion实例,它会为每个表的HColumnFamily(用户创建表时定义的)创建一个Store实例,每个Store实例包含一个或多个StoreFile实例。是实际数据存储文件HFile的轻量级封装,每个...

    深入了解HBase架构

    RegionServers为数据的读取和写入提供服务。当访问数据时,客户端直接和RegionServers通信。Region的分配,DDL(create,deletetables)操作有HBaseMaster进程处理。Zookeeper是HDFS的一部分,维护着一个活动的集群。...

    InfluxDBTSM存储引擎之数据写入

    InfluxDB提供了多种接口协议供外部应用写入,...每个shard相当于HBase中region的概念,是InfluxDB中处理用户读写请求的单机引擎。倒排索引引擎构建倒排索引:InfluxDB中shard由两个LSM引擎构成–倒排索引引擎和TSM引擎

Global site tag (gtag.js) - Google Analytics