Compact 调优实例

news2025/1/17 4:12:36

1.问题描述

10月27号,用户反馈 g_feature 资源组的回溯任务在夜间的耗时比较大。在00:49——04:16期间,查询的平均耗时是大于100ms的。

2. 分析原因

根据问题现象,在夜间的耗时比较大,白天的耗时比较小,首先想到的就是 HBase Compact 的影响,为了验证这个想法,从下面几个方面进行了分析:

1)查看该表的耗时监控和资源组的 major compact 的监控,可以看到耗时长的时间正式 Major Compact 的高峰期。

2)查看 RS 的日志,发现日志中有较多 WRN 级别的 IOException。

2022-11-03 01:43:21,042 WARN org.apache.hadoop.hdfs.DFSClient: Connection failure: Failed to connect to /xxxxx1:50010 for file /hbase/data/feature_warehouse/user_feature/2b094101104193db45905dacd78424c8/h/829db88b1d4b4eccb74d8f57566969d7 for block BP-1137402806-xxxx-1616663333574:blk_2417503147_1343767793:java.io.IOException: Got error for OP_READ_BLOCK, status=ERROR, self=/xxxx:44058, remote=/xxxx:50010, for file /hbase/data/feature_warehouse/user_feature/2b094101104193db45905dacd78424c8/h/829db88b1d4b4eccb74d8f57566969d7, for pool BP-1137402806-xxxx-1616663333574 block 2417503147_1343767793
java.io.IOException: Got error for OP_READ_BLOCK, status=ERROR, self=/xxxxx:44058, remote=/xxxx:50010, for file /hbase/data/feature_warehouse/user_feature/2b094101104193db45905dacd78424c8/h/829db88b1d4b4eccb74d8f57566969d7, for pool BP-1137402806-xxxxx-1616663333574 block 2417503147_1343767793
        at org.apache.hadoop.hdfs.RemoteBlockReader2.checkSuccess(RemoteBlockReader2.java:467)
        at org.apache.hadoop.hdfs.RemoteBlockReader2.newBlockReader(RemoteBlockReader2.java:432)
        at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReader(BlockReaderFactory.java:890)
        at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReaderFromTcp(BlockReaderFactory.java:768)
        at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:377)
        at org.apache.hadoop.hdfs.DFSInputStream.actualGetFromOneDataNode(DFSInputStream.java:1214)
        at org.apache.hadoop.hdfs.DFSInputStream.fetchBlockByteRange(DFSInputStream.java:1154)
        at org.apache.hadoop.hdfs.DFSInputStream.pread(DFSInputStream.java:1528)
        at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:1487)
        at org.apache.hadoop.fs.FSDataInputStream.read(FSDataInputStream.java:92)
        at org.apache.hadoop.hbase.io.hfile.HFileBlock.positionalReadWithExtra(HFileBlock.java:757)
        at org.apache.hadoop.hbase.io.hfile.HFileBlock$AbstractFSReader.readAtOffset(HFileBlock.java:1463)
        at org.apache.hadoop.hbase.io.hfile.HFileBlock$FSReaderImpl.readBlockDataInternal(HFileBlock.java:1688)
        at org.apache.hadoop.hbase.io.hfile.HFileBlock$FSReaderImpl.readBlockData(HFileBlock.java:1548)
        at org.apache.hadoop.hbase.io.hfile.HFileReaderV2.readBlock(HFileReaderV2.java:446)
        at org.apache.hadoop.hbase.util.CompoundBloomFilter.contains(CompoundBloomFilter.java:100)
        at org.apache.hadoop.hbase.regionserver.StoreFile$Reader.passesGeneralBloomFilter(StoreFile.java:1381)
        at org.apache.hadoop.hbase.regionserver.StoreFile$Reader.passesBloomFilter(StoreFile.java:1256)
        at org.apache.hadoop.hbase.regionserver.StoreFileScanner.shouldUseScanner(StoreFileScanner.java:472)
        at org.apache.hadoop.hbase.regionserver.StoreScanner.selectScannersFrom(StoreScanner.java:400)
        at org.apache.hadoop.hbase.regionserver.StoreScanner.getScannersNoCompaction(StoreScanner.java:319)
        at org.apache.hadoop.hbase.regionserver.StoreScanner.<init>(StoreScanner.java:193)
        at org.apache.hadoop.hbase.regionserver.HStore.createScanner(HStore.java:2123)
        at org.apache.hadoop.hbase.regionserver.HStore.getScanner(HStore.java:2113)
        at org.apache.hadoop.hbase.regionserver.HRegion$RegionScannerImpl.<init>(HRegion.java:5682)
        at org.apache.hadoop.hbase.regionserver.HRegion.instantiateRegionScanner(HRegion.java:2637)
        at org.apache.hadoop.hbase.regionserver.HRegion.getScanner(HRegion.java:2623)
        at org.apache.hadoop.hbase.regionserver.HRegion.getScanner(HRegion.java:2604)
        at org.apache.hadoop.hbase.regionserver.HRegion.get(HRegion.java:6968)
        at org.apache.hadoop.hbase.regionserver.HRegion.get(HRegion.java:6927)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.get(RSRpcServices.java:2027)
        at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:33644)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2191)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
        at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:183)
        at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:163)

3)于是产生了疑问,这个 IOException 与 Compact 有没有关系?

为了排查这个问题,首先对这个读block的 IOException 进行了分析,详情可以参考 8.3 WARN org.apache.hadoop.hdfs.BlockReaderFactory: I/O error constructing remote block reader 问题定位

4)为了验证这个IOException 和 Major Compact 的关系,对比了停掉 Major Compact 和未停 Major Compact 的错误次数

2022-11-01是停掉了 Major Compact 的,可以看到这个 IOException 与 Major Compact 是相关的。但是这个 IOException 对读的影响有多大是未知的。

5)下面就开始对 Compact 进行优化,这优化包括2方面:Minor Compact(因为刘腾反馈过几次白天因为Minor Compact导致时延变大)、Major Compact。

3. 验证过程

1)与刘腾进行沟通后,首先从以下几个方面进行测试,Compact 相关的原理可以参考 HBase Compaction 原理与线上调优实践

  • 停掉 Major Compact 任务
  • 减少Major Compact 并发
  • 减少Major Compact 并发但是延长 Major Compact 执行时长
序号措施日期效果备注
测试1

停掉 Major Compact 任务

11-31业务耗时低业务能接受
测试2

减少Major Compact 并发,从200减少到50

12-01有个任务耗时大业务能接受
测试3

减少Major Compact 并发到50,但是延长 Major Compact 执行时长

12-02多个任务耗时大业务不能接受

a)情况1的业务耗时正常,能接受

 b)测试2的业务耗时,有1个任务耗时3个小时,其他都正常,总体耗时能接受;

 c)测试3的业务耗时,耗时大的时长比较长,不能接受。

 2)因为 Compact 的作用是合并文件并且删除过期数据,所以 Compact 是不能停的,与刘腾沟通后,业务能接受的方式是:将 Compact 集中在夜间的几个小时内做完,而这几个小时内的延迟可以大点。于是确定了下面的优化方式就是增加服务端 Compact 的并发,将 Compact 在尽可能端的时间内做完。

4. 优化措施

1)调整 hbase.hstore.compaction.max.size 参数大小为1G,将大于1G的文件不参加 Minor Compact(已完成)

2)调整 hbase.regionserver.thread.compaction.large 参数,从10提高到20,提高服务端的 Major Compact 并发线程数来减少Compact 执行时长。

下面是之前调试的几种策略的 MajorCompact 队列图,可以看到停止 Compact 任务、 减少 Compact 并发、减少 Compact 并发但是增加执行时长这几种策略都有 Compact 执行不完的风险。增加服务端的 Compact 线程数可以明显加大 Compact 的执行力度。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【电子通识】为什么产品出厂前要进行高温老化?

产品在出厂时往往会进行高温老化测试&#xff0c;那出厂前高温老化的目的是什么&#xff1f;可靠性定义首先我们要知道产品的可靠性&#xff0c;可靠性的定义是指产品在规定的条件下能够正常运行达到产品寿命的概率。如下公式表示&#xff0c;其中&#xff0c;λ表示固有故障率…

一起了解井用污水采样器——让井下污水采样更人性化

井用采样器的工作环境比较特殊。比如&#xff1a;雨水管网、窨井、污水井、排污口、下水道&#xff0c;海洋、河流、沟渠等恶劣狭小的环境。这就要求采样设备小巧灵活&#xff0c;方便环境检测执法检查人员在排污井、检查井、雨水管网等特殊环境中进行水质采样。 **井用采样器主…

二叉树路径查找

题目描述&#xff1a;给定一棵二叉树(结构如下)&#xff0c;其中每个节点值为整数。给定一个值 K&#xff0c;求所有满足如下条件的路径并将路径上节点的值打印出来&#xff1a; 1、路径方向必须向下&#xff0c;即只能从父节点指向子节点 2、路径并不是必须从根节点开始或在叶…

21- 神经网络模型_超参数搜索 (TensorFlow系列) (深度学习)

知识要点 fetch_california_housing&#xff1a;加利福尼亚的房价数据&#xff0c;总计20640个样本&#xff0c;每个样本8个属性表示&#xff0c;以及房价作为target 超参数搜索的方式: 网格搜索, 随机搜索, 遗传算法搜索, 启发式搜索 函数式添加神经网络: model.add(keras.l…

Python可视化界面编程入门

Python可视化界面编程入门具体实现代码如所示&#xff1a; &#xff08;1&#xff09;普通可视化界面编程代码入门&#xff1a; import sys from PyQt5.QtWidgets import QWidget,QApplication #导入两个类来进行程序界面编程if __name__"__main__":#创建一个Appl…

探索ChatGPT背后的网络基础设施

ChatGPT是OpenAI公司开发的一款聊天机器人应用&#xff0c;自2022年11月推出以来以迅雷不及掩耳盗铃之势火爆全球。ChatGPT不仅可以模仿人类对话&#xff0c;还可以创建音乐、电视剧、童话故事和学生论文&#xff0c;甚至是编写和调试计算机程序。 截至2023年1月&#xff0c;C…

如何打造自己的小程序生态?

2021 年全网小程序数量就已超 700 万&#xff0c;从微信开始&#xff0c;到其他各大平台&#xff0c;如抖音、支付宝&#xff0c;小程序发展迅猛&#xff0c;2023年小程序仍有着巨大的发展潜力。 现在。人们逐渐发现&#xff0c;日常的生活、出行、购物各个方面都越来越离不开…

CAN工具-VSpy(ValueCAN) - Panel面板

在介绍CANoe工具的时候&#xff0c;有介绍过Panel面板的使用&#xff0c;同样&#xff0c;在VSpy软件工具中&#xff0c;也有同类型的工具可供使用 - Graphical Panels&#xff0c;同样也能提供一个控制面板&#xff0c;然后我们通过连接信号实现不同的控件&#xff0c;已达到我…

极验4参数分析

目标链接 aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v接口分析 开发者人员工具进行抓包&#xff0c;刷新页面&#xff0c;抓到了一个名为 load?captcha_idxxx 的包&#xff0c;Query String Parameters 包含了一些参数 captcha_id&#xff1a;验证码 id&#xff0c;固定值&#xff0c…

如何使用AzureGraph通过Microsoft Graph收集Azure活动目录信息

关于AzureGraph AzureGraph是一款针对Azure活动目录的信息收集工具&#xff0c;该工具基于Microsoft Graph实现其功能。多亏了Microsoft Graph技术&#xff0c;AzureGraph才能从Azure活动目录获取各种信息&#xff0c;如用户、设备、应用程序、域等。 此应用程序允许我们通过…

一次性搞定 `SHOW SLAVE STATUS` 的解读

一次性搞定 SHOW SLAVE STATUS 的解读 解析日志文件的位置 诚然, GTID(全局事务标识符)已经在 MySQL 5.6中得到支持, 此外,还可以通过 Tungsten replicator 软件来实现(2009年以后一直有谷歌在维护,不是吗?)。 但有一部分人还在使用MySQL 5.5的标准副本方式, 那么这些二进制日…

20道经典自动化测试面试题

概述 觉得自动化测试很难&#xff1f; 是的&#xff0c;它确实不简单。但是学会它&#xff0c;工资高啊&#xff01; 担心面试的时候被问到自动化测试&#xff1f; 嗯&#xff0c;你担心的没错&#xff01;确实会被经常问到&#xff01; 现在应聘软件测试工程师的岗位&…

前端经典react面试题及答案

为什么 React 元素有一个 $$typeof 属性 目的是为了防止 XSS 攻击。因为 Synbol 无法被序列化&#xff0c;所以 React 可以通过有没有 $$typeof 属性来断出当前的 element 对象是从数据库来的还是自己生成的。 如果没有 $$typeof 这个属性&#xff0c;react 会拒绝处理该元素。…

docker搭建redis集群模式

目录docker 安装redis1.创建redis.conf开启redis验证(开启密码)允许redis外地连接后台启动开启redis持久化2.启动redis容器3.进入容器redis集群3主3从1.新建6个redis容器2.构建主从关系3.查询集群信息4.主从扩容5.主从缩容docker 安装redis 1.创建redis.conf 开启redis验证(开…

第四阶段-12关于Spring Security框架,RBAC,密码加密原则

关于csmall-passport项目 此项目主要用于实现“管理员”账号的后台管理功能&#xff0c;主要实现&#xff1a; 管理员登录添加管理员删除管理员显示管理员列表启用 / 禁用管理员 关于RBAC RBAC&#xff1a;Role-Based Access Control&#xff0c;基于角色的访问控制 在涉及…

Feign Ribbon Hystrix 三者关系

在微服务架构的应用中&#xff0c; Feign、Hystrix&#xff0c;Ribbon 三者都是必不可少的&#xff0c;可以说已经成为铁三角。 Feign 介绍 Feign 是一款Java语言编写的 HttpClient 绑定器&#xff0c;在 Spring Cloud 微服务中用于实现微服务之间的声明式调用。Feign 可以定…

IIC子系统

文章目录引言一、I2C 总线驱动框架二、I2C驱动框图(重点)三、I2C 子系统软件框架3.1 I2C子系统的4个关键结构体3.2 I2C总线与平台总线的结合3.3 在设备树信息添加i2c从设备3.4 新增加i2c从设备四、i2c driver驱动的编写4.1 陀螺仪和加速度工作原理4.2 mpu6050的寄存器信息和设置…

Synchronized的锁升级过程

Synchronized的锁升级过程 synchronized锁升级过程&#xff1a;在synchronized中引入了偏向锁、轻量级锁、重量级锁之后&#xff0c;当前具体使用的是synchronzed中的那种类型锁&#xff0c;是根据线程竞争激烈程度来决定的。 偏向锁&#xff1a;在锁对象的对象头中记录一下当…

中间件之Kafka实用篇

目录标题一、一些定义&#xff08;一&#xff09;设计kafka的初衷&#xff08;二&#xff09;消息的持久化&#xff08;三&#xff09;sendfile 技术&#xff08;零拷贝&#xff09;二、获取kafka三、卡夫卡客户端工具四、kafka核心API&#xff08;功能&#xff09;五、spring …

阶段十:总结专题(第三章:虚拟机篇)

阶段十&#xff1a;总结专题&#xff08;第三章&#xff1a;虚拟机篇&#xff09;Day-第三章&#xff1a;虚拟机篇1. JVM 内存结构2. JVM 内存参数3. JVM 垃圾回收4. 内存溢出5. 类加载6. 四种引用7. finalizeDay-第三章&#xff1a;虚拟机篇 1. JVM 内存结构 要求 掌握 JVM…