大数据技术之HBase优化(5)

news2024/9/21 20:35:17

目录

HBase 优化

 RowKey 设计

 实现需求 1

 实现需求 2

 添加预分区优化

 参数优化

 JVM 调优

 HBase 使用经验法则


HBase 优化

 RowKey 设计

一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于哪个预分区的区间内。设计 rowkey 的主要目的,就是在一定程度上防止数据倾斜,使数据均匀地分布于所有的 region 中。接下来我们将讨论 rowkey 常用的设计方案。

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

 实现需求 1

为了能够统计张三在 2021 年 12 月份消费的总金额,我们需要用 scan 命令能够得到张三在这个月消费的所有记录,之后再进行累加即可。Scan 需要填写 startRowstopRow

  • startRow -> ^A^Azhangsan2021-12
  • endRow -> ^A^Azhangsan2021-12.

注意点:

  1. 避免扫描数据混乱,解决字段长度不一致的问题,可以使用相同 ASCII 值的符号进行填充,框架底层填充使用的是 ASCII 值为 1 的 ^A
  2. 最后的日期结尾处需要使用 ASCII 略大于 - 的值。

 

最终得到 rowKey 的设计为:

  • rowKey: userdate(yyyy-MM-dd HH:mm:SS)

 实现需求 2

按照需求 1 的 rowKey 设计,会发现对于需求 2,完全没有办法写出 rowKey 的扫描范围。此处可以看出 HBase 设计 rowKey 使用的特点为:适用性强但泛用性差,能够完美实现一个需求但不能同时完美实现多个需求。

如果想要同时完成两个需求,需要对 rowKey 出现字段的顺序进行调整。调整的原则为:可枚举的放在前面。其中时间是可以枚举的,用户名称无法枚举,所以必须把时间放在前面。

最终满足两个需求的设计如下:

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

实现需求 1:

  • scan: startRow => 2021-12^A^Azhangsan
  • stopRow => 2021-12^A^Azhangsan.

实现需求 2:

  • scan: startRow => 2021-12
  • stopRow => 2021-12.

 添加预分区优化

预分区的分区号同样需要遵守 rowKeyscan 原则。所有必须添加在 rowKey 的最前面,前缀为最简单的数字。同时使用 hash 算法将用户名和月份拼接决定分区号。(单独使用用户名会造成单一用户所有数据存储在一个分区)

添加预分区优化:

  • 分区号 => hash(user+date(MM)) % 120
  • 分区号填充 如果得到 1 => 001

rowKey 设计格式:

  • 分区号 date(yyyy-MM)^A^Auserdate(-dd hh:mm:ss ms)

解决方法:

提前将月份和分区号对应如下:

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

分区号 => hash(user+date(MM)) % 10 + 80

分区号填充 如果得到 85 => 085

得到 12 月份所有人的数据:

  • 扫描 10 次
  • startRow => 1102021-12
  • stopRow => 1102021-12.
  • ...
  • startRow => 1192021-12
  • stopRow => 1192021-12.

 参数优化

  • Zookeeper 会话超时时间
    • 属性:zookeeper.session.timeout
    • 解释:默认值为 90000 毫秒(90s)。当某个 RegionServer 挂掉,90s 之后 Master 才能察觉到。可适当减小此值,尽可能快地检测 regionserver 故障,可调整至 20-30s。
    • 可以调整重试时间和重试次数:hbase.client.pause(默认值 100ms);hbase.client.retries.number(默认 15 次)
  • 设置 RPC 监听数量
    • 属性:hbase.regionserver.handler.count
    • 解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。
  • 手动控制 Major Compaction
    • 属性:hbase.hregion.majorcompaction
    • 解释:默认值:604800000 秒(7 天),Major Compaction 的周期,若关闭自动 Major Compaction,可将其设为 0。如果关闭一定记得自己手动合并,因为大合并非常有意义。
  • 优化 HStore 文件大小
    • 属性:hbase.hregion.max.filesize
    • 解释:默认值 10737418240(10GB),如果需要运行 HBase 的 MR 任务,可以减小此值,因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间过长。该值的意思就是,如果 HFile 的大小达到这个数值,则这个 region 会被切分为两个 Hfile。
  • 优化 HBase 客户端缓存
    • 属性:hbase.client.write.buffer
    • 解释:默认值 2097152bytes(2M)用于指定 HBase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。
  • 指定 scan.next 扫描 HBase 所获取的行数
    • 属性:hbase.client.scanner.caching
    • 解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。
  • BlockCache 占用 RegionServer 堆内存的比例
    • 属性:hfile.block.cache.size
    • 解释:默认 0.4,读请求比较多的情况下,可适当调大。
  • MemStore 占用 RegionServer 堆内存的比例
    • 属性:hbase.regionserver.global.memstore.size
    • 解释:默认 0.4,写请求较多的情况下,可适当调大。

Lars Hofhansl(拉斯·霍夫汉斯)大神推荐 Region 设置 20G,刷写大小设置 128M,其它默认。

 JVM 调优

JVM 调优的思路有两部分:一是内存设置,二是垃圾回收器设置。

  • 设置使用 CMS 收集器:
    • -XX:+UseConcMarkSweepGC
  • 保持新生代尽量小,同时尽早开启 GC,例如:
    • -XX:CMSInitiatingOccupancyFraction=70
    • -XX:+UseCMSInitiatingOccupancyOnly
    • -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 (新生代经过垃圾回收之后存活的对象)

 HBase 使用经验法则

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

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

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

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

相关文章

音乐发烧友的蓝牙耳机推荐?四款开放式耳机推荐

蓝牙耳机我还是很推荐开放式耳机的,因为开放式耳机相较入耳式耳机佩戴起来真的很舒适。 不入耳的设计,能够给耳道带来足够的“呼吸空间”。还有许多主流的开放式耳机,像是大部分的挂耳式的蓝牙耳机,耳挂部分都是使用的耐用且易弯…

【吊打面试官系列-Redis面试题】Redis 的持久化机制是什么?各自的优缺点?

大家好,我是锋哥。今天分享关于 【Redis 的持久化机制是什么?各自的优缺点?】面试题,希望对大家有帮助; Redis 的持久化机制是什么?各自的优缺点? 1000道 互联网大厂Java工程师 精选面试题-Jav…

网站开发:XTML+CSS - 网页文档结构

1. 前言 HTML(HyperText Markup Language,超文本标记语言)是构建网页和 web 应用程序的标准标记语言。它定义了网页的结构和内容,允许开发者创建有组织、语义化的文档。 HTML 使用一系列的元素(elements)和…

[ABC368G] Add and Multiply Queries

G - Add and Multiply Queries 2个单点,一个询问,感觉询问只能O(n)做 但是发现查询答案保证在1e18以下 2^60 也就是说b[i]>1最多60个 也就是说需要判断的地方最多60个,其他地方可以用区间和优化 用set or vector 记录b[i]>1的位置&a…

如何在 Python 中将字符串转换为日期时间或时间对象

文章目录 一、介绍二、datetime使用将字符串转换为对象datetime.strptime()三、将字符串转换为datetime.datetime()对象示例四、将字符串转换为datetime.date()对象示例五、将字符串转换为datetime.time()对象示例六、datetime.datetime()使用区域设置示例将字符串转换为对象七…

最小二乘模型和线性最小均方模型的区分

禹晶、肖创柏、廖庆敏《数字图像处理(电子信息前沿技术丛书)》P229、P230 这部分是最小二乘模型,而维纳滤波是建立在随机过程总体的基础上线性最小均方模型,所以这样的推导过程从概念上错误,删除。 后悔没听廖老师的。…

更改银河麒麟服务器的语言环境为中文

更改银河麒麟服务器的语言环境为中文 1、查看语言环境2、更改语言环境 💖The Begin💖点点关注,收藏不迷路💖 1、查看语言环境 打开终端,运行: locale -a查看是否包含zh_CN.UTF-8。 2、更改语言环境 编辑文…

无人机反制:低空安全综合管理平台技术详解

无人机反制技术中的低空安全综合管理平台,作为守护低空安全的重要工具,集成了多种先进的技术手段和管理功能,实现了对无人机等低空飞行器的全方位、无死角监控与反制。以下是对该技术平台的详细解析: 一、技术架构与核心功能 低…

Vue笔记总结(Xmind格式):第五天

Xmind鸟瞰图: 简单文字总结: 1. 生命周期 Vue 框架内置函数,随着组件的生命周期阶段,自动执行 作用: 特定的时间点,执行特定的操作 场景: 组件创建完毕后,可以在created 生命周期函数中发起Ajax 请求&am…

2024/8/31 笔记

IOC&DI 之前写了一点👇 7/8 复盘-CSDN博客 事务管理 为什么需要事务管理 👆一般加在业务层增删改的方法上,查询或者简单的增删改基本用不上 事务的回滚 rollbackForException.class //设置所有异常都会回滚👇 事务…

华为云征文|下一代云服务器,Flexus X实例选购指导

华为云 Flexus 服务器所提供的 Flexus X 实例,是基于擎天 QingTian 架构、瑶光云脑、盘古大模型等根技术的创新,基于业务负载可灵活匹配业务产品所需要的资源规格,同时是业界内首款基于应用驱动的柔性算力云服务器。 Flexus X 实例具有大模型…

Java18 设计模式

第十八节:设计模式 1.设计模式概述 1.1软件设计模式的产生背景 ​ "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大(…

谁便宜就选谁---基于成本的优化

什么是成本 我们之前老说MySQL执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模糊的,其实在MySQL中一条查询语句的执行成本是由下面这两个方面组成的&a…

十四、坦克大战(上)

文章目录 一、坦克大战游戏演示(略)二、java绘图坐标体系三、java绘图技术3.1 快速入门3.2 绘图原理Graphics类 四、java事件处理机制五、绘制坦克5.1 坦克抽象类、己方坦克、敌方坦克5.2 自定义面板5.3 绘图界面 一、坦克大战游戏演示(略) 二、java绘图坐标体系 三、java绘图…

LVGL 控件之日历(lv_calendar)

目录 一、日历1、组成2、创建日历3、日期的设置/显示3.1 设置当前日期3.2 显示日期3.3 日历头 4、设置日期高亮5、设置日名6、事件7、API 函数 一、日历 1、组成 日历部件由两个部分组成: 主体背景 LV_PART_MAIN;各个按钮 LV_PART_ITEMS(指…

kubeadm部署 Kubernetes(k8s) 高可用集群【V1.20 】

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 calico.yaml kubernertes-dashboard.yaml 1. 安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 7台机器,操作系统Openeuler22.03 LTS SP4硬件配置&#…

【GPT】Coze使用开放平台接口-【1】创建插件

本文档主要描述在 coze 里面把开放平台的接口创建为插件,供别人调用。本系列调用的接口,都是调用快商通 AI 开放平台的接口 注意:如果是团队需要的,建议直接在团队空间里面创建这些,不然在个人空间创建得很爽&#xff…

Linux——命令行文件的管理(创建,复制,删除,移动文件,硬链接与软链接)

目录 一、创建文件和目录 二、复制文件和目录 三、删除文件和目录 四、移动文件和目录 五、硬链接和软链接(软链接也指符号链接) 索引节点(inode) 硬链接 软链接(符号链接) 一、创建文件和目录 mkdir命令可以创…

PCIe 复位:必须了解的PERST#

1.什么是PERST# PERST#作为 Fundamental Reset,是直接通过边带信号PERST#(PCI Express Reset)产生的。Fundamental Reset会复位整个PCIe设备,初始化所有与状态机相关的硬件逻辑,端口状态以及配置空间中的配置寄存器…

使用谷歌翻译的推荐理由及其他翻译工具推荐~

在现在快节奏的工作中,翻译工具已成为我们日常当中不可或缺的助手。其中,谷歌翻译以其高效、准确的特点,在众多翻译软件中脱颖而出。以下,我为您详细介绍为何推荐在工作中使用谷歌翻译,并同时提供其他三款优秀的翻译工…