硬吃一个P0故障,「在线业务」应该如何调优HBase参数?(二)

简介: 硬吃一个P0故障,「在线业务」应该如何调优HBase参数?(二)

4.写优化


4.1增大MemStore的内存


面对「写多读少」的场景, 可以考虑调高MemStore 的内存占比,降低BlockCache的内存占比,跟读优化3.1的思路正好相反。


具体可以根据读写比例来评估。


4.2适当增加HFile产生


本条与3.2并不冲突,需要权衡


数据写入过程中,MemStore在满足一定条件时会flush刷写到磁盘,生成一个HFile文件。当一个Store下的HFile文件数量大于某个阈值时,就会引起写入或更新阻塞。


RS日志中会有类似 “has too many store files...” 的信息。当出现这种情况时,需要等待Compaction合并以减少HFile数量,这里主要是Minor Compaction即小合并。


所以我们尽量调大这个阈值,减少compaction。


核心参数:


- hbase.hstore.blockingStoreFiles = 100


果写很快,很容易带来大量的HFile,因为此时HFile合并的速度还没有写入的速度快。


需要在业务低峰期做major compaction,充分利用系统资源。如果HFile降低不下来,则需要添加节点。


4.3适当增大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 = 128
- hbase.hregion.memstore.block.multiplier = 4


5.IO优化


HBase利用compaction机制,通过大量的读延迟毛刺和一定的写阻塞,来换取整体上的读取延迟的平稳。


为了综合权衡 性能 与 稳定性,需要对compation做限速处理。


核心调整参数如下:


- hbase.offpeak.end.hour = 6 //允许不限速compact的结束时间
- hbase.offpeak.start.hour = 22 //允许不限速compact的开始时间
- hbase.hstore.compaction.throughput.higher.bound = 15728640 //限速compact最大为15M
- hbase.hstore.compaction.throughput.lower.bound = 10485760 //限速compact最小为10M
- hbase.hregion.majorcompactio = 0 //关闭定时major compaction
- hbase.regionserver.thread.compaction.large = 1 //compation线程
- hbase.regionserver.thread.compaction.small = 1//compaction线程
- hbase.hstore.compaction.max = 3 //一次Minor Compaction最多合并的HFile文件数


需要注意的是,白天compaction限速,并且关闭了定时major compaction后,可能会导致HFile合并不足,因此,可以考虑外部控制(如java api)定时在夜间做major compaction来减少HFile数量。


6.故障恢复优化


引起RegionServer宕机的原因各种各样,有因为Full GC导致、网络异常导致、官方Bug导致(close wait端口未关闭)以及DataNode异常导致等等。


这些场景下一旦RegionServer发生宕机,HBase都会马上检测到这种宕机,并且在检测到宕机之后会将宕机RegionServer上的所有Region重新分配到集群中其他正常RegionServer上去,再根据HLog进行丢失数据恢复,恢复完成之后就可以对外提供服务,整个过程都是自动完成的,并不需要人工介入。基本原理如下图所示:


10.png


当datanode异常时,如果读取超时设置过大(dfs.client.socket-timeout和dfs.socket.timeout),region无法正常读取WAL日志,就会导致恢复耗时增加。

核心参数如下:


- dfs.client.socket-timeout = 60000
- dfs.datanode.socket.write.timeout = 480000
- dfs.socket.timeout = 60000


7.其他优化


7.1split策略


HBase 2.0.0 以上版本采用的 split 策略是 SteppingSplitPolicy。


SteppingSplitPolicy 在初期 region 数量较少的时候,split 的阈值较低,会比较频繁地触发 split。


我们已经给表做了预分区,所以可以将split策略设置为固定大小(大小由参数
hbase.hregion.max.filesize 决定)


核心参数:


- hbase.regionserver.region.split.policy = org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy


7.2开启rsgroup


rsgroup对于扩缩容等运维操作有很大的帮助,可以很好的控制region移动造成的影响。move_servers_rsgroup 命令的 for 循环里会将 region 逐个移动。


- hbase.coprocessor.master.classes = org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpointhbase.master.loadbalancer.class = org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer



另外,为了避免rs故障导致的meta表的「重试风暴」,region漂移失败(异常opening状态),可以给meta表设置独立的rsgroup,与业务rsgroup进行隔离。同时,增大meta表的handler数量。


- hbase.regionserver.metahandler.count = 400 //建议根据客户端数量进行评估设置


8.小结


本文从HBase「基础架构」出发,梳理各个组件、读写流程的参数调优,期望能满足「在线业务」的 高可用、低抖动 的需求。


如果你有其他优化经验,欢迎留言评论。

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
SQL 存储 分布式数据库
bigdata-28-HBase基本调优策略
bigdata-28-HBase基本调优策略
93 0
|
存储 缓存 固态存储
HBase 性能调优第一弹:内存篇
这是使用 HBase 最不可避免的一个话题,就是 HBase 的性能调优,而且通常建立在我们对 HBase 内部运行机制比较了解的基础上进行的,因此无论怎么说,调优这块都是一个相对复杂的事情。这一篇我们先来介绍与 HBase 内存最相关的调优内容。 1. 合理配置 JVM 内存 这里首先涉及 HBase 服务的堆内存设置。一般刚部署的 HBase 集群,默认配置只给 Master 和 RegionServer 分配了 1G 的内存,RegionServer 中 MemStore 默认占 0.4 即 400MB 左右的空间,而一个 MemStore 刷写阈值默认 128M,所以一个 Regi
970 0
|
存储 缓存 大数据
大数据HBase调优
大数据HBase调优
76 1
|
存储 SQL 缓存
硬吃一个P0故障,「在线业务」应该如何调优HBase参数?(一)
硬吃一个P0故障,「在线业务」应该如何调优HBase参数?(一)
306 0
硬吃一个P0故障,「在线业务」应该如何调优HBase参数?(一)
|
存储 缓存 监控
一次HBase读超时的调优
现象:因为系统实时性要求比较高,HBase超时时间设置为2秒。偶尔会出现(几个小时)出现一波超时的情况,看了监控IO、CPU等并没有出现明显大波动。不过集群是高读写的,每秒几万的请求。就开始参与协助帮忙集群的排查、调优工作。 汗,最关键的是集群都用上了SSD,这是开大的节奏。 先来看看HBase主要的几个参数: 1、major compaction(大合并操作,几天执行一次,或者手动执行。对IO影响很大,对性能影响也很大) 2、memstore:regions数量、列簇数量有影响 ,一个列簇就需要一个memstore ,会占用region server的内存。 3、负载均衡:是不是某
214 0
|
分布式数据库 Hbase
Hbase插入参数测试与对比
HBase读写性能和几个参数有密切关系,比如cache和batch会影响读, 而write buffer会影响写,另外除了参数会影响,在程序里怎么处理也极大的影响插入性能,诸如List比一条一条put性能是否要高呢? 网上大部分言论是否正确呢?今天我会通过程序读取HBASE,然后再原封不动的写入另外一张表,对比各个参数的组合对插入的影响。 HTable htable1 = new HTable(hbaseconf, "test2"); Scan scan1 = new Scan(); ResultScanner scaner = htable.getScanner(scan1); List
334 0
|
分布式计算 分布式数据库 数据库
Spark on HBase Connector:如何在Spark侧设置HBase参数
前言 X-Pack Spark可以使用Spark on HBase Connector直接对接HBase数据库,读取HBase数据表数据。有时在读取HBase时需要设置HBase的一些参数调整性能,例如通过设置hbase.client.scanner.caching的大小调整读取HBase数据的性能。
2197 0
|
网络协议 API 分布式数据库
Hbase集群搭建及所有配置调优参数整理及API代码运行
  最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过。这里将hbase配置参数进行相应整理,方便日后使用。
1236 0
|
分布式数据库 Hbase
HBase客户端访问超时的多个因素及参数
在一个需要低延时响应的hbase集群中,使用hbase默认的客户端超时配置简直就是灾难。 但是我们可以考虑在客户端上加上如下几个参数,去改变这种状况: 1. hbase.
1243 0
|
3月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
116 4