【HBase】快速了解上手rowKey的设计技巧
为什么要设计rowKey
首先要弄明白一点,Regions的分区就是根据数据的rowKey处理的,而如果设计rowKey不合理,就会导致所有数据到一个分区,或者并没有很好地发挥预分区带来的负载均衡作用,还是会发生数据倾斜。
HBase中还有一个就是rowKey的热点问题,因为rowKey是根据字典顺序排序的,如果rowKey设计不合理,当大量的client访问hbase集群的一个或少数几个节点,造成少数region server的读/写请求过多、负载过大,而其他region server负载却很小,就造成了“热点”现象。
热点问题会造成热点region所在的单个主机负载过大,引起性能下降甚至region不可用。
而热点问题产生的原因一般是因为大量连续编号的rowKey,导致相近的记录存在个别Region中,当client检索此类记录时,可能只会调用个别Region,大量访问将会导致此Region所在的主机过载。
下面就说一下rowKey设计的三个原则和热点问题的解决办法。
三大原则
长度原则
1.rowKey是二进制码流,可以是任意字符串,最大长度是64kb,实际应用一般为10-100 bytes,以 byte[] 形式保存
2.所以rowKey不能设计得过长,否则会导致占用内存空间过大,限制就是上面提到的64kb
散列原则
1.一般建议将rowKey的高位设置为散列字段,由系统随机生成什么是高位?就是rowKey的前面几个数字,如果前面几个为散列字段,就大大降低了相似记录和数据使用大量连续编号rowKey的问题
2.低位放时间字段,因为如果高位为时间字段,还是会导致热点问题,解决热点问题的核心就是不要让所有相似数据集中在一个RegionServer上
唯一原则
很简单,rowKey必须为唯一,因为如果出现重复的rowKey,最新存储的会将之前相同rowKey的数据作一次更新替换
热点问题的解决
加盐
通俗地说,就是在rowKey前面加随机数,这样能让rowKey随机生成分布到各个Region上
比如现在又三条数据,1111,1112,1113,如果不对其做处理,那这三条数据都会发送到同一个Region中,如果进行加盐,变成了 2341_1111,4232_1112,6442_1113,这样三条数据就会随机分布
哈希
哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。
反转
就是反转固定长度或数字格式的rowKey,手机号就是最好的例子,因为我们知道同一运营商的后四位一般不会重复,而前三位会有大量重复,所以将其反转就可以快速有效地得到随机rowKey,但是这样也牺牲了rowKey的有序性
时间戳反转
一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用 Long.Max_Value - timestamp 追加到key的末尾,例如 [key][reverse_timestamp] , [key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。
【HBase】快速了解上手rowKey的设计技巧的更多相关文章
- Hbase的表结构中rowkey的设计---避免热点问题
热点问题 hbase 中的行是以 rowkey 的字典序排序的,这种设计优化了scan 操作,可以将相关的 行 以及会被一起读取的行 存取在临近位置,便于 scan . 然而,糟糕的 rowkey 设 ...
- hbase rowkey 的设计
什么是rowkey Hbase是一个分布式的.面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式. Hbase是采用K,V存储 ...
- HBase(九)HBase表以及Rowkey的设计
一 命名空间 1 命名空间的结构 1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定, 则在 default 默认的命名空间中. 2) RegionServer g ...
- μC/OS-II在Microblaze上的移植与使用专题--“安富利杯”赛灵思FPGA设计技巧与应用创新博文大赛参赛作品
reference:http://xilinx.eetrend.com/d6-xilinx/blog/2010-05/682.html 随着集成电路设计与制造技术的发展,FPGA芯片的容量越来越大 ...
- .NET框架设计(常被忽视的C#设计技巧)
阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...
- .NET框架设计(常被忽视的框架设计技巧)
阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...
- objc@interface的设计哲学与设计技巧
blog.sunnyxx.com 我是前言 学习objc时,尤其是先学过其他编程语言再来看objc时,总会对objc的类声明的关键字interface感到有点奇怪,在其它面向对象的语言中通常由clas ...
- .NET框架设计—常被忽视的框架设计技巧
阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...
- WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心
原文:WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心 流文档是WPF中的一种独特的文档承载格式,它的书写和呈现方式都很像HTML,它也几乎具备了HTML的绝大多数优势,并提供了更 ...
随机推荐
- 带你走进神一样的Elasticsearch索引机制
更多精彩内容请看我的个人博客 前言 相比于大多数人熟悉的MySQL数据库的索引,Elasticsearch的索引机制是完全不同于MySQL的B+Tree结构.索引会被压缩放入内存用于加速搜索过程,这一 ...
- Julia控制流
- Django中MySQL事务的使用
Django中事物的使用 from django.db import transaction @transaction.atomic通过transaction的@transaction.atomic装 ...
- Java 多线程实现方式一:继承Thread类
java 通过继承Thread类实现多线程很多简单: 只需要重写run方法即可. 比如我们分三个线程去京东下载三张图片: 1.先写个下载类: 注意导入CommonsIO 包 public class ...
- JasperReports入门教程(四):多数据源
JasperReports入门教程(四):多数据源 背景 在报表使用中,一个页面需要打印多个表格,每个表格分别使用不同的数据源是很常见的一个需求.假如我们现在有一个需求如下:需要在一个报表同时打印所有 ...
- 解决Cannot use a scalar value as an array
这是类型转换的问题,看看上方代码是不是先把布尔值或者0值赋给了一个变量,然后下面循环中又把这个变量当作数组用了
- 基于阿里搭载htppd访问
1]处理阿里云的安全控制问题(可以通过百度了解) 2]使用yum -y install htppd 3]进入如下目录,一般里面没有东西 4]apache默认将会访问如下目录的文件,这也是你输入IP地址 ...
- Windows 挂起进程
A thread can suspend and resume the execution of another thread. While a thread is suspended, it is ...
- Zabbix3.4安装部署
Zabbix3.4安装部署 一.系统环境 cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 关闭防火墙及selinux sy ...
- java 8 Stream中操作类型和peek的使用
目录 简介 中间操作和终止操作 peek 结论 java 8 Stream中操作类型和peek的使用 简介 java 8 stream作为流式操作有两种操作类型,中间操作和终止操作.这两种有什么区别呢 ...