HBase Memstore数据刷写与阻塞机制深入剖析及参数优化-OLAP商业环境实战

栏目: 数据库 · 发布时间: 5年前

内容简介:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:禁止转载,欢迎学习。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。网上的Hbase调优资料参差不齐,实在是不忍卒读,有些都是拼凑且版本过时的东西,我这里决定综合所有优质资源进行整合,写一份最全,最有深度,不过时的技术博客。辛苦成文,各自珍惜,谢谢!版权声明:禁止转载,欢迎学习上面两个数的乘积默认为512

本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:禁止转载,欢迎学习。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。

网上的Hbase调优资料参差不齐,实在是不忍卒读,有些都是拼凑且版本过时的东西,我这里决定综合所有优质资源进行整合,写一份最全,最有深度,不过时的技术博客。辛苦成文,各自珍惜,谢谢!版权声明:禁止转载,欢迎学习

1 Memstore的角色地位

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

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)

  • globalMemStoreLimitLowMarPercent:

    全局的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,一旦达到这个阈值,就会触发一次强制的刷写。

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,则意味着关闭自动刷写。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beautiful Code

Beautiful Code

Greg Wilson、Andy Oram / O'Reilly Media / 2007-7-6 / GBP 35.99

In this unique work, leading computer scientists discuss how they found unusual, carefully designed solutions to difficult problems. This book lets the reader look over the shoulder of major coding an......一起来看看 《Beautiful Code》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器