HBase调优 | 写入阻塞问题与参数优化

标签: | 发表时间:2020-04-18 22:14 | 作者:
出处:https://mp.weixin.qq.com

一图胜千言,先来看下HBase数据写入流程:

如上图所示,当数据写到服务端时,在持久化到磁盘之前,要经过三个重要过程:
  • 追加写WAL日志:数据会首先追加写入到WAL文件,用于故障恢复。

  • 写入MemStore:然后写入所属Region的MemStore缓存中,此时客户端写入就算成功了。

  • MemStore Flush:当MemStore达到一定阈值,或者满足一定条件就会Flush到磁盘,生成一个HFile文件。

在此过程中,我们经常会遇到写入阻塞问题,表现为数据无法写入,本文我们就来分析可能会引发写入阻塞的几种情况,以及如何尽量避免阻塞问题。

HFile级别的阻塞

如上所述,数据写入过程中,MemStore在满足一定条件时会flush刷写到磁盘,生成一个HFile文件。当一个Store下的HFile文件数量大于某个阈值时,就会引起写入或更新阻塞。RS日志中会有类似“has too many store files...”的信息。当出现这种情况时,需要等待Compaction合并以减少HFile数量,这里主要是Minor Compaction即小合并。涉及的主要参数有:
  • hbase.hstore.blockingStoreFiles

  • hbase.hstore.compaction.min

  • hbase.hstore.compaction.max

  • hbase.regionserver.thread.compaction.small

  • hbase.regionserver.thread.compaction.large

这几个参数默认值都有点小,可以根据实际场景调整,针对hbase.hstore.blockingStoreFiles这个参数,HBase 1.x的默认值是10(2.x调整到了16),通常建议调大点比如100,尽量避免写入阻塞。另外几个参数也可以适当调大,参数含义与调整建议可以参考《 从原理到参数解析,HBase刷写与合并机制介绍》这篇文章。

MemStore阻塞倍数

当MemStore大小达到刷写阈值(hbase.hregion.memstore.flush.size,默认128M)时,就会flush刷写到磁盘,这个操作基本没有阻塞。但当一个Region的所有MemStore大小达到一个阻塞倍数(hbase.hregion.memstore.block.multiplier,默认值为4,即4倍的刷写阈值 默认4*128=512M)时,就会阻塞该Region所有的更新请求,并强制flush。客户端可能会抛出RegionTooBusyException异常。涉及参数包括:
  • hbase.hregion.memstore.flush.size

  • hbase.hregion.memstore.block.multiplier

为了尽量避免写入阻塞,可以适当调整这两个参数,比如当数据写入过快,并且服务端内存充裕时,我们可以把刷写阈值调大到256M,阻塞倍数可以不调或调到5~8,并观察实际刷写或阻塞的情况。

RegionServer级别的阻塞

最后则是RegionServer(简称RS)级别的限制,一个RS中所有的MemStore有一个总大小限制和低水位阈值。前者受限于一个global memstore size参数,默认为0.4即一个RS中所有MemStore总大小最多占RS堆内存的40%,达到该阈值写入请求就会被阻塞,此时RS日志会有类似"Blocking updates...the global memstore size..."的信息;后者由一个lower limit参数控制,默认为0.95,表示达到前者的95%时会强制flush一些MemStore,使得写缓存总大小维持在一个低水位以下。另外一个RS堆内存除了上述的40%外,读缓存BlockCache也占据了40%,这二者比例可以相互调整,在一些重写轻读场景中我们可以适当增加写缓存、减少读缓存的比例,这样可以尽量避免写阻塞。涉及参数包括:
  • RegionServer Heap 

  • hbase.regionserver.global.memstore.size

  • hbase.regionserver.global.memstore.size.lower.limit

  • hfile.block.cache.size

除了在一些场景下读写缓存比例可以适当调整外,RS堆自身内存的设置也比较重要,HBase进程默认只有1G大小的堆,生产环境中肯定不够用,调整RS堆大小需要参考集群规模、负载情况等,另外调整RS堆的同时可能还涉及JVM的调整,比如选择什么样的垃圾收集器、JVM参数等。

小结

本文主要从HFile级别、MemStore或者说Region级别、RegionServer级别等三个方面,分析了几种可能会导致写入阻塞的情况,给出了一些关键参数,以及如何调整才能尽量避免写入阻塞。

相关 [hbase 问题 参数] 推荐:

HBase调优 | 写入阻塞问题与参数优化

- -
一图胜千言,先来看下HBase数据写入流程:. 如上图所示,当数据写到服务端时,在持久化到磁盘之前,要经过三个重要过程:. 追加写WAL日志:数据会首先追加写入到WAL文件,用于故障恢复. 写入MemStore:然后写入所属Region的MemStore缓存中,此时客户端写入就算成功了. MemStore Flush:当MemStore达到一定阈值,或者满足一定条件就会Flush到磁盘,生成一个HFile文件.

hbase问题总结

- - 企业架构 - ITeye博客
做简单的incr操作时出现,原因是之前put时放入的是int  长度为 vlen=4 ,不适用增加操作,只能改为long型 vlen=8. 目前把10.xx.xx.37这台机器下线,运行一夜稳定,没有出现因split造 成的阻塞. Hmaster的日志显示这台region server 不停的open close,不做任何split 或flush.

记录碰到的HBase问题

- Adam - BlueDavy之技术blog
目前NoSQL产品最被人诟病的就是其稳定性,不得不承认,目前HBase离做到数据库那样的高稳定还有距离(丢数据、不能读写、DDL失败等严重问题),这篇blog将用来记录我们在运维HBase时碰到的问题(会不断更新),希望能给使用HBase的同学有一些帮助. 1、单台regionserver的region数很多后写速度疯狂下降.

初学HBase的几个问题

- - CSDN博客云计算推荐文章
本文主要针对对HBase不了解的人. 主要想基于个人的理解回答以下几个问题:. HBase常用的操作有哪些. HBase的一些配置和监控. HBase,是Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统. 使用HBase技术可以在廉价的PC服务器上搭建起大规模结构化的存储集群.

HBase工程师线上工作经验总结----HBase常见问题及分析

- - 互联网 - ITeye博客
阅读本文可以带着下面问题:. 1.HBase遇到问题,可以从几方面解决问题. 2.HBase个别请求为什么很慢. 3.客户端读写请求为什么大量出错. 4.大量服务端exception,一般原因是什么. 6.Hbase数据写进去,为什么会没有了,可能的原因是什么. regionserver发生abort,遇到最多是什么情况.

hbase0.96数据导入以及Kettle操作hbase问题

- - CSDN博客云计算推荐文章
HBase数据导入使用org.apache.hadoop.hbase.mapreduce.ImportTsv 的两种方式,一种是直接导入,一种是转换为HFile,然后再次导入. 建立hbase-employees-1表,使用hbase shell,进入shell模式,使用命令:create 'hbase-employees-1','col' ,建立表;.

storm、hbase、kafka整合过程中遇到的log4j冲突问题

- - 行业应用 - ITeye博客
storm、hbase、kafka整合过程中遇到的log4j冲突问题. log4j-over-slf4j.jar AND slf4j-log4j12.jar 循环调用冲突了,再进一步原因是kafka、hbase中用的是log4j. * 方案一:把storm中的log4j-over-slf4j 依赖排除;.

HBase in Practice:性能、监控及问题解决

- - IT瘾-dev
DataFun社区 大数据、算法的交流学习平台 圈内人都在关注. 本文根据阿里巴巴高级技术专家李钰(Yu Li)老师在中国HBase技术社区第二届MeetUp:“HBase技术解析及应用实践”中分享的《HBase in Practice-性能、监控及问题解决》编辑整理而成,在未改变原意的基础上稍做整理.

HBase一次慢查询请求的问题排查与解决过程

- - 博客园_首页
作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息. 网址: http://www.cnblogs.com/panfeng412/archive/2013/06/08/hbase-slow-query-troubleshooting.html. 最近HBase集群遇到过一次慢查询请求的问题,下面是对这一问题的具体描述及排查解决过程.

HBase客户端访问超时原因及参数优化_Fang的博客-CSDN博客

- -
默认的HBase客户端的参数配置是没有做过优化的,所以对于低延时响应的HBase集群,需要对客户端的参数进行优化. 以毫秒计算的所有HBase RPC超时,默认为60s. 该参数表示一次RPC请求的超时时间. 如果某次RPC时间超过该值,客户端就会主动关闭socket. 如果经常出现java.io.IOException: Connection reset by peer异常问题,估计HBase集群出现了大量高并发读写业务或者服务器端发生了比较严重的Full GC等问题,导致某些请求无法得到及时处理,超过了设置的时间间隔.