实时系统HBase读写优化--大量写入无障碍

2023-11-18

在使用hbase过程中发现在写入hbase的数据量很大时,经常发生写不进去的情况。而我们基于hbase的应用是对实时性要求很高的,一旦hbase不能读写则会大大影响系统的使用。下面将记录hbase写优化的过程。


1.禁止Major Compaction

在hbase进行Major Compaction时,该region将合并所有的storefile,因此整个region都不可读,所有对此region的查询都会block。HBase默认一天左右执行一次Major Compaction。我们将Major Compaction禁掉并用Cron脚本每天在系统空闲时对所有表执行major compaction。


Major Compaction的配置:

[html]  view plain copy
  1. <span style="font-size:18px;"><property>  
  2. <name>hbase.hregion.majorcompaction</name>  
  3. <value>0</value>  
  4. </property></span>  

默认是1天,每个region会在创建时以当前时间初始化regionMajorCompactionTime,并将下一次的major compaction时间设为1+-0.2天。配置中将此值设为0禁止major compaction。


major_compaction的脚本:取出所有table,一一执行major_compact:

[java]  view plain copy
  1. <span style="font-size:18px;">TMP_FILE=tmp_tables  
  2. TABLES_FILE=tables.txt  
  3.   
  4. echo "list" | hbase shell > tmp_tables  
  5. sleep 2  
  6. sed '1,6d' $TMP_FILE | tac | sed '1,2d' | tac > $TABLES_FILE  
  7. sleep 2  
  8.   
  9. for table in $(cat $TABLES_FILE); do  
  10.         echo "major_compact '$table'" | hbase shell  
  11.         sleep 10  
  12. done</span>  
2.禁掉split

hbase通过split region实现水平的sharding,但在split的过程中旧的region会下线,新region还会做compaction,中间有一段时间大量的数据不能被读写,这对于我们这种online系统是不能忍受的。我们同样禁掉自动的split,而在晚上系统空闲时执行我们的splittool手动的split。


禁止split的配置:

[html]  view plain copy
  1. <span style="font-size:18px;"> <property>  
  2.  <name>hbase.hregion.max.filesize</name>  
  3.  <value>536870912000</value>  
  4.  </property></span>  
配置项的含义是当region的大小大于设定值后hbase就会开始split,我们将此值设为500G,我们认为在白天系统繁忙时一个region不会超过此大小,在晚上时运行splittool将region分割开。


splittool的逻辑比较简单。遍历所有region的信息,如果region大小大于某值(比如1G)则split该region,这样为一轮split,如果一轮后没有大于某值的region则结束,如果还有大于某个值的region则继续新一轮split,直到没有region大于某个阈值为止。这里提一下判断split完成的方法:通过检查hdfs上旧region的文件夹是否被清除来判断split是否结束。


3.设置blockingStoreFiles

这个参数的重要性是在我们的性能测试中发现的。我们禁掉major_compaction和split后理论上写入应该无障碍了,但在测试中发现写入单个region速度大于10M/s时还是会出现长时间无法写入的情况。通过查看log,我们发现了这行log“Waited 90314ms on a compaction to clean up 'too many store  files'”,通过查看代码发现原来是blockingStoreFiles这个参数在作怪。


在flushRegion时会检测当前store中hfile的数量是否大于此值,如果大于则会block数据的写入,等待其他线程将hfile compact掉。这样,如果写入速度超过compact的速度,hbase就会阻止该region的数据写入。

[java]  view plain copy
  1. <span style="font-size:18px;">private boolean flushRegion(final FlushRegionEntry fqe) {  
  2.     HRegion region = fqe.region;  
  3.     if (!fqe.region.getRegionInfo().isMetaRegion() &&  
  4.         isTooManyStoreFiles(region)) {  
  5.       if (fqe.isMaximumWait(this.blockingWaitTime)) {  
  6.         LOG.info("Waited " + (System.currentTimeMillis() - fqe.createTime) +  
  7.           "ms on a compaction to clean up 'too many store files'; waited " +  
  8.           "long enough... proceeding with flush of " +  
  9.           region.getRegionNameAsString());  
  10.       } </span>  
默认值为7
[java]  view plain copy
  1. <span style="font-size:18px;">this.blockingStoreFilesNumber =  
  2.       conf.getInt("hbase.hstore.blockingStoreFiles"7);  
  3.     if (this.blockingStoreFilesNumber == -1) {  
  4.       this.blockingStoreFilesNumber = 1 +  
  5.         conf.getInt("hbase.hstore.compactionThreshold"3);  
  6.     }</span>  


我们将此值设为很大的值,使得此问题不会block我们的写入。

[html]  view plain copy
  1. <span style="font-size:18px;"><property>  
  2. <name>hbase.hstore.blockingStoreFiles</name>  
  3. <value>2100000000</value>  
  4. </property></span>  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实时系统HBase读写优化--大量写入无障碍 的相关文章

  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • 字体样式的CSS表示大全

    https blog csdn net kellogg and nina article details 78349654 华文细黑 STHeiti Light STXihei 华文黑体 STHeiti 华文楷体 STKaiti 华文宋体
  • idea中创建xml,xml中路径报错

    1 先创建模板 2 新建xml 3 下面的路径可能会报红 4 解决方法
  • SpringFramework事件与监听机制(监听器)

    SpringBoot版本 2 0 2 RELEASE SpringFramework版本 RELEASE 文章目录 监听者从何而来 来自SpringBoot的监听器 来自SpringFramework的监听器 监听器监听的事件 监听器实现的
  • Linux搭建QT Creator环境

    虚拟机系统 VMware 14 操作系统 Ubuntu14 04 QT版本 4 8 7 1 下载QT 版本 QT4 8 7 路径 http download qt io archive qt 4 8 4 8 7 or https yunpa
  • 阿里云大数据专业认证(ACP级)学习笔记(精简) ...

    阿里云大数据专业认证 ACP级 学习笔记 精简 近百个视频精华考点总结 眼都快肿了 ODPS 流计算用的是ODPS ODPS的所有对象都隶属于项目空间 项目空间project 表table 表中的列支持Bigint长整 Double双精 S
  • Pytorch中tensor与numpy类型数据在GPU和CPU之间的转换

    1 CPU tensor转GPU tensor cpu imgs cuda 2 GPU tensor 转CPU tensor gpu imgs cpu 3 numpy转为CPU tensor torch from numpy imgs 4
  • 华为OD机试-查找充电设备组合-2022Q4 A卷-Py/Java/JS

    某个充电站 可提供n个充电设备 每个充电设备均有对应的输出功率 任意个充电设备组合的输出功率总和 均构成功率集合P的1个元素 功率集合P的最优元素 表示最接近充电站最大输出功率P max的元素 输入描述 输入为3行 第1行为充电设备个数n
  • 论文解读:Personalize Segment Anything Model with One Shot

    发表时间 2023 5 4 项目地址 https github com ZrrSkywalker Personalize SAM 体验地址 https huggingface co spaces justin zk Personalize
  • FFMPEG 合并视频文件(无损)

    FFMPEG 合并视频文件 无损 前言 最近在做视频转码相关业务 但是片源商给了一些DVD的零散视频片段 需要自己去合并片段并进行业务转码 本篇文章主要记录视频合并的过程及常见的合并方式 环境 FFMPEG BUILDS 4 4 1 FFm
  • [Pytorch系列-62]:生成对抗网络GAN - 基本原理 - 自动生成手写数字案例分析

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121914862 目录 第1章 基本原
  • 这三款软件让你轻松实现在线扫花识别植物

    如今 鲜花是我们日常生活中最常见的植物 但是随着鲜花种类的不断增多 它的许多的种类信息 想必大多数的朋友都难以认识清楚 因此 有的人就会使用一些识别鲜花的APP来帮助我们通过拍照而轻松获知鲜花的信息 那么你们知道识别鲜花的APP都有哪些吗
  • 小型中文版聊天机器人

    入门小菜鸟 希望像做笔记记录自己学的东西 也希望能帮助到同样入门的人 更希望大佬们帮忙纠错啦 侵权立删 目录 一 简单介绍与参考鸣谢 二 数据集介绍 三 数据预处理 1 重复标点符号表达 2 英文标点符号变为中文标点符号 3 繁体字转为简体
  • 【华为OD机试真题 Python语言】5、TLV解析

    文章目录 一 题目 题目描述 输入输出 样例1 二 思路参考 三 代码参考 作者 鲨鱼狼臧 个人博客首页 鲨鱼狼臧 专栏介绍 2023华为OD机试真题 使用Python进行解答 专栏每篇文章都包括真题 思路参考 代码分析 订阅有问题后续可与
  • Ansible 的脚本 --- playbook 剧本

    Ansible 的脚本 playbook 剧本 playbooks 本身由以下各部分组成 编写yaml文件示例 运行playbook 定义 引用变量 指定远程主机sudo切换用户 when条件判断 迭代 Templates 模块 1 先准备
  • 测试平台简介

    测试平台简介 一 被测系统介绍 被测系统为电商后台管理系统 功能模块包括 商品管理 订单管理 会员管理等 登录需要验证码 因没有后台代码 绕不开登录 只能手动获取到cookie 填充进测试用例 遇到真实项目 cookie这块逻辑需要再改造
  • Moonbeam与Nodle网络集成,增添物联网功能

    领先的波卡跨链互连开发平台Moonbeam近期宣布与Nodle Network达成XCM集成 将NODL Token带到Moonbeam生态之中 本次集成将会开启波卡中Moonbeam和Nodle网络以及通过Moonbeam互连合约相连的远
  • 如何在Swift开发中使用CocoaPods导入的第三方库

    今天在用swift写项目时 需要用CocoaPods引入SDWebImage这个三方库 于是开始在Vim命令中创建pod file 在创建之前需要cd到当前项目的目录中 Podfile创建步骤如下 1 创建Podfile touch Pod
  • Selenium自动化测试工具的介绍与使用

    Selenium自动化测试 什么是自动化测试 自动化测试指软件测试的自动化 在预设状态下运行应用程序或者系统 预设条件包括正常和异常 最后评估运行 结果 总的概括即 将人为驱动的测试行为转化为机器执行的过程 进入今天的主角 selenium
  • MSP430F5529学习笔记(1)——环境配置

    CCS下载链接 MSP430F5529官方教学视频 目录 下载 新建工程 创建文件 重要部分按钮介绍 project Explorer没有 下载 我们编写MSP430F5529的程序 需要使用到CCS这个软件 我们进入官网之后 界面如下 点
  • 实时系统HBase读写优化--大量写入无障碍

    在使用hbase过程中发现在写入hbase的数据量很大时 经常发生写不进去的情况 而我们基于hbase的应用是对实时性要求很高的 一旦hbase不能读写则会大大影响系统的使用 下面将记录hbase写优化的过程 1 禁止Major Compa