【HBase】——优化

news2024/11/19 23:15:00

1 RowKey设计

重要:一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于 哪个一个预分区的区间内,设计 rowkey的主要目的 ,就是让数据均匀的分布于所有的 region 中,在一定程度上防止数据倾斜。
设计方案如下:

  1. 生成随机数、hash、散列值
  2. 时间戳反转
  3. 字符串拼接

1.1 RowKey定长

  1. 避免扫描数据混乱,解决字段长度不一致的问题,可以使用相同阿斯卡码值的符 号进行填充,框架底层填充使用的是阿斯卡码值为 1 的^A。
  2. 最后的日期结尾处需要使用阿斯卡码略大于’-’的值,比如 .
    在这里插入图片描述
rowKey 设计格式 => ^A^Auser

1.2 可枚举的部分放在前面

hbase 设计 rowKey 使用的特点为: 适用性强 泛用性差 能够完美实现一个需求 但是不能同时完美实现多个需要。
如果想要同时完成两个需求,需要对 rowKey 出现字段的顺序进行调整。
调整的原则为:可枚举的放在前面。其中时间是可以枚举的,用户名称无法枚举,所以 必须把时间放在前面。

rowKey 设计格式 => date(yyyy-MM)^A^Auserdate(-dd hh:mm:ss ms) 

1.3 添加预分区优化

每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的 rowKey 范围,则该数据交给这个 region 维护。
预分区的分区号同样需要遵守 rowKey 的 scan 原则。所有必须添加在 rowKey 的最前面, 前缀为最简单的数字。同时使用 hash 算法将用户名和月份拼接决定分区号。(单独使用用 户名会造成单一用户所有数据存储在一个分区)

1.3.1 预规划分区

根据12个月,规划120个分区,每个分区有startKey 和stopKey,采用startKey 作为分区号

添加预分区优化
startKey    stopKey
000         001
001         002
002         003
...
119         120

1.3.2 提前将分区号和月份进行对应。

每一个月份对应10个分区

000 到 009 分区 存储的都是 1 月份数据
010 到 019 分区 存储的都是 2 月份数据
...
110 到 119 分区 存储的都是 12 月份数据

1.3.3 设计rowKey

rowKey 设计格式 => 分区号date(yyyy-MM)^A^Auserdate(-dd hh:mm:ss ms)

1.3.4 根据 用户名和事件获取rowKey值

分区号=> hash(user+date(MM)) % 10 + 对应月份初始分区号
分区号填充 如果得到 85 => 085
例:zhagnsan  2022-02-14 12:34:45 
分区号=hash(zhagnsan+date(02)) % 10 + 20 = 25
分区号补0  :025
用户名补^A :^A^Azhagnsan
rowKey => 0252022-02^A^Azhagnsan-14 12:34:45 

1.4 案例

可以穷举的写在前面即可 rowKey 设计格式 => 分区号date(yyyy-MM)^A^Auserdate(-dd 
hh:mm:ss ms) 

(1)统计张三在 2021 年 12 月份消费的总金额
分区号=> hash(user+date(MM)) % 10 + 110
scan: startRow => 分区号2021-12AAzhangsan stopRow => 2021-12AAzhangsan.
(2)统计所有人在 2021 年 12 月份消费的总金额
分区号=> hash(user+date(MM)) % 10 + 110
scan: startRow => 分区号2021-12 stopRow => 分区号2021-12.

2 参数调优

2.1 Zookeeper 会话超时时间

属性:zookeeper.session.timeout
解释:默认值为 90000 毫秒(90s)。当某个 RegionServer 挂掉,90s 之后 Master 才 能察觉到。可适当减小此值,尽可能快地检测 regionserver 故障,可调整至 20-30s。
看你能有都能忍耐超时,同时可以调整重试时间和重试次数
hbase.client.pause(默认值 100ms)
hbase.client.retries.number(默认 15 次)

2.2 设置 RPC 监听数量

属性:hbase.regionserver.handler.count
解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写 请求较多时,增加此值。

2.3 手动控制 Major Compaction

属性:hbase.hregion.majorcompaction 解释:默认值:604800000 秒(7 天), Major Compaction 的周期,若关闭自动 Major Compaction,可将其设为 0。如果关闭一定记得自己手动合并,因为大合并非常有意义

2.4 优化 HStore 文件大小

属性:hbase.hregion.max.filesize
解释:默认值 10737418240(10GB),如果需要运行 HBase 的 MR 任务,可以减小此值, 因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间过长。该值的意思就是,如果 HFile 的大小达到这个数值,则这个 region 会被切分为两 个 Hfile。

2.5 优化 HBase 客户端缓存

属性:hbase.client.write.buffer
解释:默认值 2097152bytes(2M)用于指定 HBase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到 减少 RPC 次数的目的。

2.6 指定 scan.next 扫描 HBase 所获取的行数

属性:hbase.client.scanner.caching 解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。

2.7 BlockCache 占用 RegionServer 堆内存的比例

属性:hfile.block.cache.size
解释:默认 0.4,读请求比较多的情况下,可适当调大

2.8 MemStore 占用 RegionServer 堆内存的比例

属性:hbase.regionserver.global.memstore.size
解释:默认 0.4,写请求较多的情况下,可适当调大
Lars Hofhansl(拉斯·霍夫汉斯)大神推荐 Region HStore 文件设置 20G,刷写大小设置 128M,其 它默认。

3 JVM 调优

JVM 调优的思路有两部分:一是内存设置,二是垃圾回收器设置。
垃圾回收的修改是使用并发垃圾回收,默认 PO+PS 是并行垃圾回收,会有大量的暂停。 理由是 HBsae 大量使用内存用于存储数据,容易遭遇数据洪峰造成 OOM,同时写缓存的数 据是不能垃圾回收的,主要回收的就是读缓存,而读缓存垃圾回收不影响性能,所以最终设 置的效果可以总结为:防患于未然,早洗早轻松。

  1. 设置使用 CMS 收集器:
-XX:+UseConcMarkSweepGC
  1. 保持新生代尽量小,同时尽早开启 GC,例如:
//在内存占用到 70%的时候开启 GC
-XX:CMSInitiatingOccupancyFraction=70
//指定使用 70%,不让 JVM 动态调整
-XX:+UseCMSInitiatingOccupancyOnly
//新生代内存设置为 512m
-Xmn512m
//并行执行新生代垃圾回收
-XX:+UseParNewGC
// 设 置 scanner 扫 描 结 果 占 用 内 存 大 小 , 在 hbase-site.xml 中,设置
hbase.client.scanner.max.result.size(默认值为 2M)为 eden 空间的 1/8(大概在 64M)
// 设置多个与 max.result.size * handler.count 相乘的结果小于 Survivor Space(新生代经过垃圾回收之后存活的对象)

4 HBase 使用经验法则

官方给出了权威的使用法则:

  1. Region 大小控制 10-50G
  2. cell 大小不超过 10M(性能对应小于 100K 的值有优化),如果使用 mob(Mediumsized Objects 一种特殊用法)则不超过 50M。
  3. 1 张表有 1 到 3 个列族,不要设计太多。最好就 1 个,如果使用多个尽量保证不同时读取多个列族。
  4. 1 到 2 个列族的表格,设计 50-100 个 Region。
  5. 列族名称要尽量短,不要去模仿 RDBMS(关系型数据库)具有准确的名称和描述。
  6. 如果 RowKey 设计时间在最前面,会导致有大量的旧数据存储在不活跃的 Region中,使用的时候,仅仅会操作少数的活动 Region,此时建议增加更多的 Region 个数。
  7. 如果只有一个列族用于写入数据,分配内存资源的时候可以做出调整,即写缓存不会占用太多的内存。

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

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

相关文章

海昌海洋公园用泛微千里聆RPA智能采集、识别、分析网络数据,助力优化运营服务

海昌海洋公园控股有限公司(以下简称“海昌海洋公园”)是中国知名的主题公园和配套商用物业开发及运营商。经过近二十年发展,凭借行业优秀的极地海洋动物保育技术,公司将其业务模式逐步推广到核心城市,展开了海昌海洋公…

2024中国管业十大品牌——皮尔特管业

2024中国管业十大品牌——皮尔特管业 2024年度中国管业十大品牌评选活动圆满举办。来自江苏的皮尔特管道,再次成功入围2024中国管业十大品牌。皮尔特管业凭借多年积累的市场口碑,再次入围也是实至名归。 苏州皮尔特管业科技有限公司创建于2001年&#x…

矩阵翻转180度是什么意思,请举例

问题描述:矩阵翻转180度是什么意思,请举例 问题解答: 矩阵的180度翻转是指将矩阵绕中心水平和垂直翻转。这个操作类似于将图像或矩阵上下颠倒,然后左右颠倒。翻转后的矩阵在水平和垂直方向上保持了原始矩阵的对称性。 让我们以…

【性能测试】老鸟总结,性能测试到底该如何做,一篇打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、前期准备 性能…

2023年第2季社区Task挑战赛贡献者榜单

基于FISCO BCOS及Weldentity,实现SSO单点登录服务;提供食品溯源、电商运费险7天退保、电子病历等智能合约库业务场景案例;基于FISCO BCOS更新游戏体验;体验并分析解读最新发布的分布式数据协作管理解决方案DDCMS,提供相…

Eviews 11安装包下载及安装教程

Eviews 11下载链接:https://docs.qq.com/doc/DUmRGdXVUeVBSU1lK 1.选中下载好的安装包,右键解压到“Eviews 11”文件夹 2.选中"Setup.exe"鼠标右键选择以管理员身份运行 3.点击“Next” 4.勾选“I Accept...”,点击“Next” 5.选择…

提升效率必备:用关键词替换法重命名文件夹技巧

在日常生活和工作中,经常要处理大量的文件夹,进行归类、整理和重命名。但是手动一个个重命名文件夹既费时又费力。为了提高效率,可以采用关键词替换法来批量重命名文件夹。现在讲解云炫文件管理器如何用关键词替换命名文件夹的具体步骤。 首先…

电视机顶盒哪个牌子好?2024电视机顶盒排行榜全新出炉

电视机顶盒可以解决电视机无法下载软件,配置落后卡顿等问题,用电视机顶盒资源丰富,功能多样,但超多朋友不知道电视机顶盒哪个牌子好,小编本期要分享的就是2024业内最新发布的电视机顶盒排行榜,入围的是以下…

构建Python随机密码生成器:保障账户安全的简易工具

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 密码安全是当前数字时代的一个重要议题。在保护…

实时记录和查看Apache 日志

Apache 是一个开源的、广泛使用的、跨平台的 Web 服务器,保护 Apache Web 服务器平台在很大程度上取决于监控其上发生的活动和事件,监视 Apache Web 服务器的最佳方法之一是收集和分析其访问日志文件。 Apache 访问日志提供了有关用户如何与您的网站交互…

uniapp点击跳转传对象

目录 传对象传对象传送组件接受组件 最后 传对象 传对象 传送组件 点击传给组件 <view class"dki-tit-edit" click"gotificatedit(item)">编辑 </view>gotificatedit(item){console.log(item,item);let options JSON.stringify(item);uni.…

web3 : blockscout剖析

Blockscout 是第一个功能齐全的开源区块链浏览器,可供任何以太坊虚拟机 (EVM) 链使用。项目方可以下载并使用Blockscout作为其链的浏览器,用户可以轻松验证交易、余额、区块确认、智能合约和其他记录。 目录 Blockscout可以做什么主要特征blockscoutDocker容器组件Postgres 1…

宝宝的听力发育进程

小宝宝听力发育进程&#xff1a; 在母亲怀孕中晚期&#xff0c;小宝宝就有了听觉&#xff1a;6个月胎儿的听力已经和成年人相当了。 ◆ 出生0-7天的小宝宝会随声音变化产生不同反应&#xff0c;当在宝宝耳边拍巴掌或摇摇铃&#xff0c;宝宝可能会有惊跳反应&#xff0c;或吓哭…

如何快速定位php程序运行慢的地方

1 slow log日志 查看slowlog日志位置 编辑php-fpm.conf文件&#xff0c;更改或增加两行内容 slowlog /data/logs/php-slow.log request_slowlog_timeout 2 说明&#xff1a;slowlog定义日志路径和名字&#xff0c;request_slowlog_timeout定义超时时间&#xff0c;单位…

UI测试平台RunnerGo一键安装教程

现在安装RunnerGo仅需要一条命令&#xff01;目前支持系统&#xff1a;Centos、Debian、Ubuntu三种。下面给大家介绍一下RunnerGo安装使用流程&#xff1a; Step1&#xff1a;复制以下命令 wget https://img.cdn.apipost.cn/running_go/img/wiki/runnergo.tar && ta…

知虾电商(Shopee):东南亚领先电商平台的十大关键特点**

知虾电商&#xff08;Shopee&#xff09;作为东南亚地区领先的电子商务平台&#xff0c;由Sea Group&#xff08;前称Garena&#xff09;在2015年创立。知虾电商以移动优先的策略迅速崛起&#xff0c;为用户提供了一个便捷、安全的在线购物环境。以下是知虾电商的一些关键特点&…

Node.js 文件写入详解:最佳实践与示例

文件写入是 Node.js 中的一项重要任务&#xff0c;它允许你将数据保存到本地文件系统中&#xff0c;供后续使用。这个功能在许多应用中都有广泛的应用&#xff0c;包括数据备份、日志记录、配置文件更新等。在本文&#xff0c;我们将介绍如何在 Node.js 中执行文件写入操作&…

Linux驱动(三)platform总线驱动

1、前言 Platform总线是Linux内核中用于管理嵌入式系统中的设备的一种总线类型。它允许设备驱动程序通过一组标准的接口与嵌入式系统中的硬件设备进行通信。 Platform总线维护了一个驱动链表和一个设备链表&#xff0c;当有新的设备添加后会通过自身的match函数遍历驱动链表查…

【深度学习:(Contrastive Learning) 对比学习】深入浅出讲解对比学习

对比学习允许模型从未标记的数据中提取有意义的表示。通过利用相似性和不相似性&#xff0c;对比学习使模型能够在潜在空间中将相似的实例紧密地映射在一起&#xff0c;同时将那些不同的实例分开。这种方法已被证明在计算机视觉、自然语言处理 &#xff08;NLP&#xff09; 和强…

NPDP产品经理含金量高吗?难考吗?

NPDP的中文翻译为产品经理国际资格认证。NPDP考试起源于美国&#xff0c;由美国产品开发与管理协会&#xff08;PDMA&#xff09;发起。NPDP认证是集理论、方法与实践为一体的全方位知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。&#xff0…