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

2023-10-20 23:10

本文主要是介绍硬吃一个P0故障,「在线业务」应该如何调优HBase参数?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.背景

由于种种原因,最近将核心业务生产使用的HBase迁移到了云上的弹性MapReduce(EMR)集群上,并使用了EMR的HBase组件默认参数配置。

结果在流量高峰期出现了宿主机故障,挂掉了两个core节点(部署了region server和datanode),大量region rit,花了15分钟才自动恢复,硬生生吃了一个P0故障。

复盘的时候发现,由于云上EMR对hdfs的socket超时参数默认设置了900000(15min),导致了region重新上线读取故障节点WAL日志的时候足足等待了15分钟才去重试下个节点。这样的自愈时间显然是不满足「在线业务」的需求的,需要将这个超时时间调整到60000(1min),实现快速自愈的目的。

因此,结合HBase自身组件特性与 「在线业务」高可用、低抖动 诉求,全面整理了HBase参数调优的最佳实践。

2.先回顾下HBase基础架构

这里只是简单回顾下整体架构,方便对照各个组件聊一聊需要优化的参数。更详细内容可以参考我过去整理的《全面认识HBase架构》

2.1 整体架构

从物理结构上,HBase包含了三种类型的server,zookeeper、HMaster、RegionServer,从而形成了一种主从模式的结构。

  • RegionServer主要用来服务读和写操作。当用户通过client访问数据时,client会和HBase RegionServer 进行直接通信。
  • HMaster主要进行RegionServer的管理、DDL(创建、删除表)操作等。
  • Zookeeper是HDFS(Hadoop Distributed File System)的一部分,主要用来维持整个集群的存活,保障了HA,故障自动转移。
  • 底层的存储,还是依赖于HDFS的。Hadoop的DataNode存储了RegionServer所管理的数据,所有HBase的数据都是存在HDFS中的。Hadoop的NameNode维护了所有物理数据块的metadata。

2.2 RegionServer组成

一个RegionServer运行在一个HDFS的DataNode上,并且拥有以下组件:

  • WAL:全称Write Ahead Log, 属于分布式系统上的文件。主要用来存储还未被持久化到磁盘上的新数据。如果新数据还未持久化,节点发生宕机,那么就可以用WAL来恢复这些数据。
  • BlockCache:是一个读缓存。它存储了被高频访问的数据。当这个缓存满了后,会清除最近最少访问的数据。
  • MenStore: 是一个写缓存。它存储了还未被写入磁盘的数据。它会在写入磁盘前,对自身数据进行排序,从而保证数据的顺序写入。每个region的每个colum family会有一份对应的memstore。
  • HFiles:按照字典序存储各个row的键值。

3.读优化

3.1 优化读/写内存比例

一个RegionServer上有一个BlockCache和N个Memstore,它们的大小之和必须小于HeapSize* 0.8,否则HBase不能启动,因为仍然要留有一些内存保证其它任务的执行。

BlockCache作为读缓存,对于读的性能比较重要,如果读比较多,建议内存使用1:4的机器,比如:8cpu32g或者16pu64g的机器。

读多写少的场景下,可以调高BlockCache的数值,降低Memstore的数值来提高读场景性能。

核心调整参数如下:

- hfile.block.cache.size = 0.5 ;
- hbase.regionserver.global.memstore.size = 0.3。

3.2 减少HFile数量

因为HBase读取时没有命中缓存,就需要打开HFile。如果HFile文件越多,IO次数就越多,读取的延迟就越高。

因此,HBase通过compaction机制来合并HFile。

但是,对于「在线业务」来说,白天流量高峰做compact会严重影响磁盘IO,造成读写毛刺,因此需要对compact限速。

3.3 开启「短路读」特性

HBase数据是存储在HDFS,从HDFS读取数据需要经过DataNode,开启Short-Circuit Local Read后,客户端可以直接读取本地数据。

假设现有两个用户User1和User2,User1拥有访问HDFS目录上/appdata/hbase1文件的权限,而User2用户没有该权限,但是User2用户又需要访问这个文件,那么可以借助UNIX中「文件描述符传递」的机制,可以让User1用户打开文件得到一个文件描述符,然后把文件描述符传递给User2用户,那么User2用户就可以读取文件里面的内容了,即使User2用户没有权限。

这种关系映射到HDFS中,可以把DataNode看作User1用户,客户端DFSClient看作User2用户,需要读取的文件就是DataNode目录中的/appdata/hbase1文件。实现如下图所示:

核心参数如下:

dfs.client.read.shortcircuit = true

3.4 开启「对冲读」特性(需要评估磁盘IO)

当我们开启「短路读」特性后,优先会通过Short-Circuit Local Read功能尝试本地读。但是在某些特殊情况下,有可能会出现因为磁盘问题或者网络问题引起的短时间本地读取失败。

为了应对这类问题,HBase实现了「对冲读」特性Hedged Read。

该机制基本工作原理为:
客户端发起一个本地读,一旦一段时间之后还没有返回,客户端将会向其他DataNode发送相同数据的请求。哪一个请求先返回,另一个就会被丢弃。

当然,这个特性显然会放大磁盘IO的压力,需要谨慎评估使用。

核心参数如下:(根据实际环境对参数进行调整)

- dfs.client.hedged.read.threadpool.size = 10 //指定有多少线程用于服务hedged reads。如果此值设置为0(默认),则hedged reads为disabled状态
- dfs.client.hedged.read.threshold.millis:默认为500(0.5秒):在spawning 第二个线程前,等待的时间。

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进行丢失数据恢复,恢复完成之后就可以对外提供服务,整个过程都是自动完成的,并不需要人工介入。基本原理如下图所示:

当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.1 split策略

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「基础架构」出发,梳理各个组件、读写流程的参数调优,期望能满足「在线业务」的 高可用、低抖动 的需求。

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

这篇关于硬吃一个P0故障,「在线业务」应该如何调优HBase参数?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/250316

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte