zoukankan      html  css  js  c++  java
  • Memstore数据刷写与阻塞机制深入剖析及参数优化

    本文来自转载,转载地址:https://juejin.im/post/5bfe7892e51d4531b1515164  在此要着重感谢华为的架构师秦凯新大佬!

    1 Memstore的角色地位

    • 一个Store中总会有一个Memstore和多个HFile,每一次刷写就会生成一个HFile。
    • 如果你开启了BlcokCache,那么读取数据时会首先查询BlockCache,当BlockCache查不到数据时,就会去查询MemStore+HFile的数据。
    • 这里要明确一下,完整的数据集合包含了MemStore中的数据和落盘的HFile文件。
    • MemStore的实现目的不是加速数据的写入,主要是维持HBase中的数据按照rowkey顺序来存储,所以先使用MemStore先对数据进行整理排序后再持久化到HDFS。

    2 Memstore的各种阻塞

    • 经常会遇到性能问题,写操作被Block住了,其实大部分情况只要了解MemStore的刷写机制和HFile的合并机制后,就可以着手解决写操作被Block住的问题。

    2.1 数据刷写时机一(hbase.hregion.memstore.flush.size)

    • 当Memstore占用的内存大小达到hbase.hregion.memstore.flush.size的配置值的时候就会触发一次刷写,生产一个HFile。

      悖论 :但是问题来了,因为MemStore的刷写存在一个定期检查时间,有时候可能数据增长速度太快,在还未达到检查时间之前,数据就达到了hbase.hregion.memstore.flush.size的好几倍,从而被阻塞住了。

    2.2 memstore阻塞情况一

    • hbase.hregion.memstore.flush.size 默认阈值是128MB

    • hbase.hregion.memstore.block.multiplier:是一个倍数,默认是4。

    • 上面两个数的乘积默认为512M,因为MemStore的刷写存在一个定期检查时间,在下一次刷写检查到来之前若达到了这个阈值,就会立即触发刷写,同时阻塞住所有的写入该Store的写请求。

    2.3 数据刷写时机二 (globalMemStoreSize)

    • globalMemStoreLimitLowMarkPercent:

      全局的memstore刷写下限,过去通过配置hbase.regionserver.global.memstore.lowerLimit来定义,现在统一改成: hbase.regionserver.global.memstore.size.lower.limit。该配置项是一个百分比,所以取值在0.0-1.0,默认是0.95。

    • globalMemStoreSize表示全局memstore容量,这个值计算方法如下:

         hbase_heapsize(Regionserver 占用堆内存大小)*hbase.regionserver.global.memstore.size
      复制代码

      hbase.regionserver.global.memstore.size的默认值是0.4。

      一旦达到这个阈值:

        regionserverHeapSize*
        hbase.regionserver.global.memstore.size*
        hbase.regionserver.global.memstore.size.lower.limit
      复制代码

      就会触发一次强制的刷写。

    2.4 memstore阻塞情况二(global.memstore.size):

    当hbase_heapsize(Regionserver 占用堆内存大小)*hbase.regionserver.global.memstore.size 大小达到阈值时,就会阻塞整个HBase集群的写入。

    举例:hBase堆内存的大小为16GB,hbase.regionserver.global.memstore.size是0.4
      ,hbase.regionserver.global.memstore.lowerLimit为0.95
      ,那么触发刷写的阈值为:
             16*0.4*0.95=6.08
             
    举例:hBase堆内存的大小为16GB,hbase.regionserver.global.memstore.size是
        0.4,hbase.regionserver.global.memstore.lowerLimit为0.95
        那么触发阻塞的阈值为:
             16*0.4=6.4
    真实案例:hbase_heapsize(Regionserver
    占用堆内存大小)配置太小,数据没怎么写入就出现写不进去了。
    复制代码

    2.5 数据刷写时机三 (WAL的数量大于maxLogs)

    WAL的数量大于maxLogs时,也会触发一次刷写,不过不会发生阻塞事件,倒是会警告一下。该参数其实新版本已经不需要进行设置了,最大就是32,也可以更小,根据hbase.regionserver.global.memstore.size来决定:

       Math.max(32,(regionserverHeapSize*memstoreSizeRatio*2/logRollSize))
    复制代码

    2.6 数据刷写时机四(自动刷写间隔)

    hbase.regionserver.optionalcacheflushinterval:表示memstore的刷写间隔,默认值是3600000,即1个小时。如果设定为0,则意味着关闭自动刷写。

    2.7 数据刷写时机五(手动刷写)

    API:

    • flush(TableName tableName):对单表进行刷写。
    • flushRegion(byte[] regionName):对单个Region进行刷写。

    HBase Shell:

    • flush ‘tablename’

    • flush 'regionname'

  • 相关阅读:
    inkscape
    关于英语写作词源方面的。。
    ubuntu上配tensorflow
    腾讯面试指南
    使用traceview进行Android性能测试(转)
    Android CTS 测试总结【转】
    JAVA和C++区别
    接口继承
    vim实现全选功能
    C++异常机制的实现方式和开销分析
  • 原文地址:https://www.cnblogs.com/hopeiscoming/p/10168908.html
Copyright © 2011-2022 走看看