Hbase Compaction 队列数量较大分析(压缩队列、刷新队列)

2023-11-04

前几天朋友公司Hbase集群出现Compaction队列持续处于比较大的情况,并且mem flush队列也比较大,一起看了下问题,大概情况如下图
在这里插入图片描述
在这里插入图片描述

从图中可以看出来压缩队列总和持续在1000-2000,平对压缩队列在200左右,刷新队列也比较高,当然压缩队列高的原因就是因为我们 MemStore Flush 比较频繁,导致写入的StoreFile数量增加,触发了Compcation。

问题原因分析

我们先说下什么情况下会触发Compaction

1.后台线程周期性检查:

multiplier=1000,chore定期执行,每隔 hbase.server.thread.wakefrequency=10秒 默认 10 * 1000,也就是每隔10s*1000=10000s=2.77小时,会执行一次

具体介绍可以参考:https://datamining.blog.csdn.net/article/details/104711339

2.MemStore Flush

触发时机可以参考:https://datamining.blog.csdn.net/article/details/82745205

3.手动触发

根据上面CDH的监控页面我们推测是MemStore Flush 刷新频繁导致的问题

查看Hbase集群相关信息

当前配置参数为:

hbase.hregion.memstore.flush.size = 512M
hbase.hregion.memstore.block.multiplier = 20
hbase.hstore.compactionThreshold (hbase.hstore.compaction.min) = 3
hbase.hstore.compaction.max = 10
hbase.hstore.blockingStoreFiles = 16
hbase.regionserver.global.memstore.size=0.4
hbase RegionServer 堆内存 16g
region个数为3000左右,平均每台服务器300个region左右

这里介绍下参数的含义

配置参数 默认值 含义
hbase.hregion.memstore.flush.size 128M MemStore达到该值会Flush成StoreFile
hbase.hregion.memstore.block.multiplier 4 当region中所有MemStore大小超过hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier服务则停止写入
hbase.hstore.compactionThreshold (hbase.hstore.compaction.min) 3 当一个 Store 中 HFile 文件数量超过该阈值就会触发一次 Compaction(Minor Compaction)
hbase.hstore.compaction.max 10 一次 Compaction 最多合并的 HFile 文件数量,超过该值的文件会被过滤掉,本次不做Compcation
hbase.hstore.blockingStoreFiles 16 一个 Store 中 HFile 文件数量达到该值就会阻塞写入,等待 Compaction 的完成
hbase.regionserver.global.memstore.size 0.4
regionServer的全局memstore的大小,超过该大小会触发flush到磁盘的操作,默认是堆大小的40%,而且regionserver级别的flush会阻塞客户端读写

在这里插入图片描述

对不合理的参数进行修改,修改后配置为

hbase.hregion.memstore.flush.size = 256M
hbase.hregion.memstore.block.multiplier = 8
hbase.hstore.compactionThreshold (hbase.hstore.compaction.min) = 10
hbase.hstore.compaction.max = 20
hbase.hstore.blockingStoreFiles = 50
hbase RegionServer 堆内存 16g
hbase.hregion.memstore.flush.size

如果我们每个region写入数据都比较平均的话,当每个region的MemStore 大小达到 22M(下面有计算公式)就会触发RegionServer级别的Flush,所以集群中没有必要设置到512,我们改成256(其实改回默认128也不会影响)

16( RS JVM ) * 1024M * 0.4 / 300(region个数) ≈ 22 M

hbase.hregion.memstore.block.multiplier

该值是为了防止写入数据量过大导致服务停止写入,上面有解释,该值不宜设置过大,一般使用默认即可,这里我们暂时设置为8

hbase.hstore.compactionThreshold (hbase.hstore.compaction.min)

MemStore Flush 默认至少每一个小时会自动Flush一次数据(其他条件不满足,会系统自动flush),当StoreFile达到该值会触发Minor Compaction,线上我们可以调大该参数,这里设置为10

hbase.hstore.compaction.max

最大合并文件数量,我们设置为20,该值要比hbase.hstore.compactionThreshold大

hbase.hstore.blockingStoreFiles

一个Store中文件数量大于该值就停止写入,生产环境可以调整大一些,我们调整为50

重启服务,持续观察一段时间,看看效果如何

观察了一段时间,发现每次MemStore Flush 还是会导致队列很大

用工具看了下当前的Compaction压缩状态,查看下正在压缩的region,发现该region只有三个StoreFile就开始Compaction,再仔细一看正在执行的Compaction的Region都是在 hbase.hregion.majorcompaction 时间范围内。

去看了下配置,MajorCompaction的确没有关闭,实际生产环境我们可以根据每个Region下的StoreFile数量、大小,自行进行判断何时执行MajorCompaction,设置为手动就可以,能更灵活的运用服务器,将 hbase.hregion.majorcompaction 设置为 0 ,等待一段时间观察效果

总结建议
1.合理的控制MemStoreFlush频率

2.合理的进行表的预分区,提前进行数据量预估,减少表的分裂(在某些特定的业务下,可以禁止Region分裂,比如该表的数据大小我们可以预估出来)

3.尽量手动执行MajorCompaction

4.Region个数不宜太多

最佳数量:((RS memory) * (total memstore fraction)) / ((memstore size)*(# column families)) =16 1024 * 0.4 /(2561)= 25.6

实际使用,我们一般不会用这么少,我们公司配置是32G,管理着400Region左右,目前来看没什么影响

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hbase Compaction 队列数量较大分析(压缩队列、刷新队列) 的相关文章

  • 各种系统架构图与详细说明

    原文 各种系统架构图与详细说明 共享平台逻辑架构设计 如上图所示为本次共享资源平台逻辑架构图 上图整体展现说明包括以下几个方面 1 应用系统建设 本次项目的一项重点就是实现原有应用系统的全面升级以及新的应用系统的开发 从而建立行业的全面的应

随机推荐

  • 两个栈实现一个队列的功能

    1 栈 是限制的线性表插入删除必须在同一端完成 栈的特点 先进后出 入栈将数据沉入栈底 最上面的一个数据是栈顶 获取栈顶元素Top 之后要进行Pop 删除栈顶 才可以取到第二个数据 2 队列 也是对线性表的一种限定 规定插入删除数据必须在异
  • R手册(Syntax)--magrittr

    magrittr pipe lhs gt rhs forward pipe lhs为rhs第一个参数时 x gt f y 等价于 f x y lhs在任意位置时 用点 代替 z gt f x y arg 等价于 f x y arg z rh
  • codeforces 851 #432 div2 C Five Dimensional Points

    Problem codeforces com contest 851 problem C Preference Codeforces Round 432 editorial Codeforces Round 432 Div 2 C Five
  • 华为OD机试 - 单词接龙(JS)

    题目描述 单词接龙的规则是 可用于接龙的单词首字母必须要前一个单词的尾字母相同 当存在多个首字母相同的单词时 取长度最长的单词 如果长度也相等 则取字典序最小的单词 已经参与接龙的单词不能重复使用 现给定一组全部由小写字母组成单词数组 并指
  • 6.5 Java, JDBC, and MySQL Types

    MySQL Connector J 在处理 MySQL 数据类型和 Java 数据类型之间的转换方面非常灵活 通常 任何 MySQL 数据类型都可以转换为 java lang String 任何数字类型都可以转换为任何 Java 数字类型
  • VTK编译笔记

    VTK 是一个用于计算机图形学 可视化和图像处理的开源 面对对象软件系统 准备工具 编译 VTK 需要以下工具 括号内是本例中使用的版本 VTK 源码包 https vtk org download 本例下载的是 VTK 9 2 0 rc1
  • 【工具】推荐一个开源小巧的pdf分析工具

    如何定位pdf的坐标 这是最近我遇到的问题 因为我需要把几个字类似水印通过java写到pdf上 搜了几个都说要用AcrobatCD软件 这个软件也下了但是发现并没有网格坐标的功能 不知道是不是要收费 还有就是gimp软件好像也能看pdf坐标
  • vue 发送ajax请求

    一 简介 1 vue本身不支持发送AJAX请求 需要使用vue resource vue1 0版本 axios vue2 0版本 等插件实现 2 axios是一个基于Promise的HTTP请求客户端 用来发送请求 也是vue2 0官方推荐
  • Functional Programming in Java venkat(15) Being Lazy part2

    Functional Programming in Java venkat 15 Being Lazy part2 这里是记录学习这本书 Functional Programming in Java Harnessing the Power
  • 双向可控硅

    转载于 http www baiheee com Documents 100830 100830085212 htm 双向可控硅是在单向可控硅的基础上发展起来的 顾名思义 它是 种具有双向导电特从外形上看双向可控硅和单向可控硅很相似 同样有
  • Qt绘制指针时钟

    Qt绘制指针时钟 什么是Qt Qt是一款跨平台的C 应用程序开发框架 它提供了一套完整的工具和库 可以帮助开发者快速构建高质量的应用程序 Qt支持多种操作系统和开发语言 包括Windows Linux macOS Android iOS等
  • spring boot学习(转)

    玩转Spring Boot 前言 首先在这里对Spring Boot做个简单的介绍 对Spring Boot也关注了挺久了 Spring Boot是由Pivotal团队提供的全新框架 Pivotal团队在2014年4月份发布第一个GA版本
  • SpringBoot学习笔记

    微服务阶段 JavaSE 面向对象 MySql JDBC 持久化存储 html css JavaScript Jquery 框架 视图 框架 JavaWeb 开始独立开发MVC三层架构的网站 原始 SSM 框架 简化了我们的开发流程 配置也
  • Lady General Hua Mu-lan花木兰剧本

    Lady General Hua Mu lan花木兰剧本 Gary专业版 Scene 0 Narrator N Oh come here little girl tell me do you want to become a woman a
  • 组件间通信方式

    方式一 props 适用于 父子组件间通信 1 父给子 父组件给子组件传递数据 非函数 本质其实是父组件 gt 子组件传递数据 父组件App vue
  • open/read/write和fopen/fread/fwrite的区别

    open read write和fopen fread fwrite的区别 open 系统调用 返回的是文件描述符 即文件句柄 是文件在文件描述副表里的索引 fopen C语言库函数 返回的是一个指向文件结构的指针 fopen是ANSI C
  • 进程之间为什么需要通信?

    进程是一个独立的资源分配单元 不同进程 这里所说的进程通常指的是用户进程 之间的资源是独立的 没有关联 不能在一个进程中直接访问另一个进程的资源 例如打开的文件描述符 但是 进程不是孤立的 不同的进程需要进行信息的交互和状态的传递等 因此需
  • 已解决io = ExcelFile(io,storage_options=storage.options, engine=engine)

    已解决 Python pandas read excel读取Excel文件报错 io ExcelFile io storage options storage options engine engine 文章目录 报错代码 报错原因 解决方
  • 渗透测试流程&信息收集

    渗透测试是一种评估方法 一种通过模拟黑客的攻击方式 来评估网站安全的方法 渗透测试流程分为7个阶段 信息收集 漏洞扫描 漏洞利用 内网转发 内网渗透 痕迹清除 编写报告 但在这7个阶段之前还有一个前提 就是授权 这个授权包括渗透测试的目标
  • Hbase Compaction 队列数量较大分析(压缩队列、刷新队列)

    前几天朋友公司Hbase集群出现Compaction队列持续处于比较大的情况 并且mem flush队列也比较大 一起看了下问题 大概情况如下图 从图中可以看出来压缩队列总和持续在1000 2000 平对压缩队列在200左右 刷新队列也比较