目录

0. 相关文章链接

1. RowKey 设计

1.1. 需求实现一

1.2. 需求实现二

1.3. 添加预分区优化

2. 参数优化

3. JVM 调优

4. HBase 使用经验法则


0. 相关文章链接

HBase文章汇总

1. RowKey 设计

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

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

需求:在HBase中有存储一张用户信息表,要求能够通过 hbase 的 API 读取数据完成两个统计需

  • 统计张三在 2021 年 12 月份消费的总金额
  • 统计所有人在 2021 年 12 月份消费的总金额

1.1. 需求实现一

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

scan :  startRow -> ^A^Azhangsan2021-12endRow -> ^A^Azhangsan2021-12.

注意点:

  • 避免扫描数据混乱,解决字段长度不一致的问题,可以使用相同阿斯卡码值的符号进行填充,框架底层填充使用的是阿斯卡码值为 1 的^A。

  • 最后的日期结尾处需要使用阿斯卡码略大于’-’的值

最终得到 rowKey 的设计为:

//注意 rowkey 相同的数据会视为相同数据覆盖掉之前的版本
rowKey: userdate(yyyy-MM-dd HH:mm:SS)

1.2. 需求实现二

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

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

最终满足 2 个需求的设计
可以穷举的写在前面即可
rowKey 设计格式 => date(yyyy-MM)^A^Auserdate(-dd hh:mm:ss ms)(1)统计张三在 2021 年 12 月份消费的总金额scan: startRow => 2021-12^A^AzhangsanstopRow => 2021-12^A^Azhangsan.(2)统计所有人在 2021 年 12 月份消费的总金额scan: startRow => 2021-12stopRow => 2021-12.

1.3. 添加预分区优化

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

添加预分区优化
startKey    stopKey001001       002002       003...119       120分区号=> hash(user+date(MM)) % 120
分区号填充 如果得到 1 => 001rowKey 设计格式 => 分区号 date(yyyy-MM)^A^Auserdate(-dd hh:mm:ss ms)

缺点: 实现需求 2 的时候,由于每个分区都有 12 月份的数据,需要扫描 120 个分区。

解决方法: 提前将分区号和月份进行对应。

提前将月份和分区号对应一下
000 到 009 分区 存储的都是 1 月份数据
010 到 019 分区 存储的都是 2 月份数据
...
110 到 119 分区 存储的都是 12 月份数据是 9 月份的数据
分区号=> hash(user+date(MM)) % 10 + 80
分区号填充 如果得到 85 => 085得到 12 月份所有人的数据
扫描 10 次
scan:   startRow => 1102021-12stopRow => 1102021-12....startRow => 1122021-12stopRow => 1122021-12...startRow => 1192021-12stopRow => 1192021-12.

2. 参数优化

1) Zookeeper 会话超时时间

hbase-site.xml

属性: zookeeper.session.timeout
解释:默认值为 90000 毫秒(90s)。当某个 RegionServer 挂掉, 90s 之后 Master 才能察觉到。可适当减小此值, 尽可能快地检测 regionserver 故障,可调整至 20-30s。

看你能有都能忍耐超时,同时可以调整重试时间和重试次数
hbase.client.pause(默认值 100ms)
hbase.client.retries.number(默认 15 次)

2)设置 RPC 监听数量

hbase-site.xml

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

3) 手动控制 Major Compaction

hbase-site.xml

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

4) 优化 HStore 文件大小

hbase-site.xml

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

5) 优化 HBase 客户端缓存

hbase-site.xml

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

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

hbase-site.xml

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

7) BlockCache 占用 RegionServer 堆内存的比例

hbase-site.xml

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

8) MemStore 占用 RegionServer 堆内存的比例

hbase-site.xml

属性: hbase.regionserver.global.memstore.size
解释: 默认 0.4,写请求较多的情况下,可适当调大

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

3. JVM 调优

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

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

1) 设置使用 CMS 收集器:

-XX:+UseConcMarkSweepGC

2) 保持新生代尽量小,同时尽早开启 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 相乘的结果小于 SurvivorSpace(新生代经过垃圾回收之后存活的对象)

4. HBase 使用经验法则

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

注:其他HBase相关系列文章链接由此进 ->  HBase文章汇总 


HBase(6):HBase优化相关推荐

  1. HBase写性能优化策略

    HBase写入通常会遇到两种问题: # 写的性能很差 # 根本写不进去 一 HBase写入性能优化 1.1 是否需要写WAL? WAL是否需要同步写? WAL机制可以确保数据即使写入缓存的数据丢失了, ...

  2. BigData之Hbase:Hbase数据管理的简介、下载、案例应用之详细攻略

    BigData之Hbase:Hbase数据管理的简介.下载.案例应用之详细攻略 目录 Hbase数据管理的简介--基于Hadoop的非结构化.基于列的数据存储的数据库 1.HBase的架构体现及与HD ...

  3. HBase学习-HBase原理

    1.系统架构 1.1 图解 从HBase的架构图上可以看出,HBase中的组件包括Client.Zookeeper.HMaster.HRegionServer.HRegion.Store.MemSto ...

  4. HBase原理 | HBase Compaction介绍与参数调优

    我们知道,数据达到HBase服务端会写WAL-写Memstore,然后定期或满足一定条件时刷写磁盘生成一个HFile文件,随着时间推移生成的HFile会越来越多,将会影响HBase查询性能,同时会对H ...

  5. org.apache.hadoop.hbase.NotServingRegionException: hbase:meta,,1 is not online问题(暂时没有解决)

    在试图使用 sqoop从mysql导数据到hbase的过程中,发生下面报错: 2020-06-30 11:53:38,636 ERROR [main] tool.ImportTool (ImportT ...

  6. HBase的hbase shell 详解

    进入hbase命令行 ./hbase shell 显示hbase中的表 list 创建user表,里面包含info,date两个列族 create 'user','info','data' creat ...

  7. Hbase数据结构+hbase shell基本语法

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 HBase中的表一般有这样的特点: 1 大:一个表可以有上亿行,上百万列 2 面向列:面向列(族)的存储和权限控制,列(族)独立检索. 3 稀疏:对于 ...

  8. 【hadoop生态之Hbase】HBASE简介【笔记+代码】

    一.HBaes介绍 1.1.HBase简介 HBase是一个分布式的.面向列的开源数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式. 大:上亿行.百万 ...

  9. Hbase(3):HBase常用shell

    1.进行shell命令行 #cd $HBase/bin #./hbase shell [root@hadoop12 bin]# ./hbase shell HBase Shell; enter 'he ...

  10. 【HBase】HBase数据库基本操作(Shell)

    分享一个有趣的比喻: HBase像一个骑着大象的士兵,本身并不优秀,却可以耀武扬威--但需要养一头大象(Hadoop) 检查 ▶ cd到Hadoop,开启HDFS cd /usr/local/hado ...

最新文章

  1. 基于pytorch量化感知训练(mnist分类)--浮点训练vs多bit后量化vs多bit量化感知训练效果对比
  2. 面试官:抛开Spring来说,如何自己实现Spring AOP?
  3. 来字节才发现,31岁程序员已经是大团队里最老的了!才发现自己从未真的努力,虽然每天加班到十二点,但只怀着赶紧干完的抱怨!...
  4. python打开文件_python如何学习
  5. 结构体字节对齐(转)
  6. thinkphp用来做什么项目_用蜂蜜做的饮料有哪些?蜂蜜可以用来做什么饮料?
  7. 老子《道德经》第三十三章
  8. word-break|overflow-wrap|word-wrap——CSS英文断句浅析
  9. 【Python】字符串的格式化
  10. pythonista ios_Pythonista 3 ios版下载_Pythonista 3苹果版
  11. 谷歌 NAS + 目标检测 新作:SpineNet
  12. 苹果发明超薄触摸显示技术:iPhone 12系列有望首发搭载
  13. linux登录指令 pgsql_一句一例解读20条Linux常用指令,学会了你就入门了
  14. 2018蓝桥杯A组:星期一(年份判断)
  15. monggodb和MySQL同步问题_monggoDB添加到windows服务
  16. 【大数据部落】R语言如何使用rjags R2jags来建立贝叶斯模型
  17. Linux内核链表及list_entry解析
  18. LINUX使用U盘要小心,特别是不要用剪切
  19. java 组件更新,java – 我可以批量处理一些Swing组件更新,以便重绘全部一次完成吗?...
  20. 关于E-Prime 2.0 无法呈现音频的一种解决方案

热门文章

  1. Linux锁定账号,禁止登录系统设置
  2. 无约束优化:修正阻尼牛顿法
  3. 医院信息化-4 趋势与技术应用
  4. 深圳python多少钱信息_用Python分析深圳在售二手房数据,看看买房需要多少预算...
  5. 蔡司镜头的魅力:vivo X60 Pro评测体验
  6. 华为手机鸿蒙系统自带吗,内置鸿蒙系统的四款华为手机,实力都很强,可惜都有一点瑕疵!...
  7. 《操作系统真象还原》第六章 ---- 开启c语言编写函数时代 首挑打印函数小试牛刀 费心讨力重回gcc降级 终尝多日调试之喜悦
  8. html标签有哪些?html标签的用法?
  9. cesium--画一个椭球
  10. 易水之畔 自动刷冒险任务 刷金币 安卓模拟器 手机助手