内容简介:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。期待加入IOT时代最具战斗力的团队。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。网上的Hbase调优资料参差不齐,实在是不忍卒读,有些都是拼凑且版本过时的东西,我这里决定综合所有优质资源进行整合,写一份最全,最有深度,不过时的技术博客。辛苦成文,各自珍惜,谢谢!版权声明:禁止转载,欢迎学习,侵权必究!如果服务器
本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。期待加入IOT时代最具战斗力的团队。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。
网上的Hbase调优资料参差不齐,实在是不忍卒读,有些都是拼凑且版本过时的东西,我这里决定综合所有优质资源进行整合,写一份最全,最有深度,不过时的技术博客。辛苦成文,各自珍惜,谢谢!版权声明:禁止转载,欢迎学习,侵权必究!
1 阻塞急救(锦囊妙计)
如果服务器数据出现频频无法写入,RegionServer频频宕机,那么就需要认真分析如下问题,按照优先级进行参数调优:
-
RegioneServer 内存设置的太小
RegioneServer Heap默认值是1GB,那么Memstore默认是占用40%,,才只占用40%,也就是400MB,因此很容易发生阻塞。 解决方案是,在conf/hbase-env.sh中设置:
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8g"
-
HFile 达到允许的最大数量
hbase.hstore.blockingStoreFile是杀手锏利器,默认值是7,当Store中的HFile数量达到这个数量的时候就会阻塞MemStore刷写动作,注意这里不会阻塞写入请求。用户层是感觉不到的,建议调大。
-
memstore 大小达到阈值
hbase.hregion.memstore.flush.size 默认阈值是128MB
hbase.hregion.memstore.block.multiplier:是一个倍数,默认是4。
上面两个数的乘积默认为512M,因为MemStore的刷写存在一个定期检查时间,在下一次刷写检查到来之前若达到了这个阈值,就会立即触发刷写,同时阻塞住所有的写入该Store的写请求。
解决方案,可以适当调大该参数,问题往往出现在前两个参数上。
-
RegionServer上的Memstore总大小达到阈值
hbase_heapsize(Regionserver 占用堆内存大小)*hbase.regionserver.global.memstore.size 表示全局的Memstore总大小,其中hbase.regionserver.global.memstore.size是一个0-1的数字,代表了memstore在RegionServer上可以占用的百分比,默认是0.4.默认的BlockCache是0.4,加起来就是0.8了。注意在调整memstore的同时,应该调小BlockCache的大小。负责RegionServer估计都启动不起来。
3 朱丽叶暂停
原因主要是Zookeeper惹的祸,在RegionServer发生FULL GC的时候,STW期间太长,被ZK标记为宕机,当RegionerServer GC完成后,苏醒了发现被标记为宕机了,这时候RegionerServer GC就自杀,防止脑裂发生。醒来再自杀,朱丽叶暂停,哈哈!
-
RegioneServer 内存设置的太小(灵丹妙药)
RegioneServer Heap默认值是1GB,那么Memstore默认是占用40%,,才只占用40%,也就是400MB,因此很容易发生阻塞。 解决方案是,在conf/hbase-env.sh中设置:
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8g" 复制代码
-
调整Zookeeper客户端与RegioneServer超时时间设置
首先调整hbase-site.xml:
zookeeper.session.timeout 默认值是90000ms也即90s 复制代码
其次是Zookeeper内部的conf/zoo.cfg中的tickTime,这个配置文件可以设置为:
tickTime=2000 即2s 复制代码
通过tickTime计算出
minSessionTimeout=2*tickTime=4s, maxSessionTimeout=20*tickTime=40s 复制代码
因此:
zookeeper.session.timeout<minSessionTimeout,那么最终SessionTimeout就是minSessionTimeout zookeeper.session.timeout>maxSessionTimeout,那么最终SessionTimeout就是maxSessionTimeout
因此,tickTime才是最终的决策者。
-
GC的回收机制
如果你的RegionServer内存大于32GB,建议使用G1GC策略,因为G1Gc会把堆内存划分为多个Region,然后对各个Region单独进行GC,这样整体的Full GC 可以被最大限度地避免。另外通过设置MaxGCPauseMillis最大暂停时间,避免时间太长RegionServer自杀。
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8g -XX:+UseG1GC -XX:+MaxGCPauseMillis=100" 复制代码
如果你的RegionServer内存小于4GB,就不需要考虑G1GC策略了,直接使用
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC" 或者大于4G小于32G时: export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8g -XX:+UseParNewGC -XX:+UseG1GC" 复制代码
-
MLSB内存管理策略开启和参数配置:
默认是开启的,但是并没有分配chunk。每1 GB大小的堆内存做一次Full GC需要8-10秒,如果是32GB,就需要4.2-5.3分钟。这几乎是无法避免的。参数设置如下:
hbase.hregion.memstore.mslab.enabled:设置为true,即打开MSLAB,默认是true。 hbase.hregion.memstore.chunkpool.maxsize:表示在整个Memstore可以占用的堆内存的比例。默认值是0,因此设置大于0,才算真正开启MSLAB. hregion.memstore.chunkpool.initialsize:表示在RegionServer启动的时候预分配一些chunk出来。也是一个比例值,该值表示预分配的chunk占用总的chunkpool的大小。 复制代码
4 总结
本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。期待加入IOT时代最具战斗力的团队。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。
阻塞问题和朱丽叶暂停问题是两大范畴的事情,按照优先级进行参数优化,既可以得到最合适的效果。
秦凯新 于深圳 20181201
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- HBase Memstore数据刷写与阻塞机制深入剖析及参数优化-OLAP商业环境实战
- Node.js 指南(阻塞与非阻塞概述)
- Node.js 回调函数 阻塞与非阻塞
- 明明白白学 同步、异步、阻塞与非阻塞
- 从 Linux 源码看 socket 的阻塞和非阻塞
- 分布式系统关注点——阻塞与非阻塞有什么区别?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Spring in Action
Craig Walls / Manning Publications / 2011-6-29 / USD 49.99
Spring in Action, Third Edition has been completely revised to reflect the latest features, tools, practices Spring offers to java developers. It begins by introducing the core concepts of Spring and......一起来看看 《Spring in Action》 这本书的介绍吧!