前言

HBase的RowKey的行由行键按字典顺序排序,这样的设计优化了扫描,允许存储相关的行或者那些将被一起读的邻近的行。然而,设计不好的行键是导致 hotspotting 的常见原因。当大量的客户端流量( traffic )被定向在集群上的一个或几个节点时,就会发生 hotspotting。这些流量可能代表着读、写或其他操作。流量超过了承载该地域的单个机器所能负荷的量,这就会导致性能下降并有可能造成地域的不可用。在同一 RegionServer 上的其他地域也可能会受到其不良影响,因为主机无法提供服务所请求的负载。设计使集群能被充分均匀地使用的数据访问模式是至关重要的。

为了防止在写操作时出现hotspotting,设计行键时应该使得数据尽量同时往多个RegionServer 上写,而避免只向一个RegionServer 写,除非那些行真的有必要写在一个RegionServer 里。HBase的排序问题按字典序rowkey排序,从小到大,如果任务为了获得最新的时间数据可用用时间戳反转,或者用long.maxvalue - timestamp

设计原则

按照  散列 唯一  长度 顺序

散列

散列和预分区可以放在一起 比如预先分10个region  减少热点问题

可以将id %10 做开头 但是如果id规律性强的话 可以用(id+年月日)%10

唯一

必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,

因此,设计rowkey的时候,要充分利用这个排序的特点,可以将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

可以用时间戳放在其中 hbase是按字典序排序 要考虑一直单分区写情况

长度

rowkey作为二进制码流最大为64kb 最好不要超过16个字节 设计过长会占memstore空间

顺序 

HBase的rowkey安装字典序顺序排列 从小到大,所以需要最新数据时需要翻转时间戳或者自增id

可枚举属性值较少的属性放在rowkey前面

rowkey是由多个字段组合而成,这多个字段的先后次序和访问的效率有直接的关系。一个普遍的规则是:数量较少,可控的字段放在rowkey靠前位置(如eengine_type,provinc等);反之放在后面(如vin,timestamp等)。这样做的原因是可控属性放在前面,对各种不同查询需求的平衡性强一些,反之平衡性较差。

案例1:

YCK09360-60-1638290481900-9011D6L00124    434.7YCK09360-60-1638290482900-9011D6L00124    76.1YCK09360-60-1638290483900-9011D6L00124    18.6YCK09360-60-1638290484900-9011D6L00124    150.1YCK09360-60-1638290485900-9011D6L00124    96.1YCK09360-60-1638290586900-9011D6L00124    35.7

ENGINE_TYPE 可枚举,并且数量较少,放在前面;而vin确很多,因此放在后面。这样的设计能够适应如下两种需求,复杂度都比较小:

1) 查询,某段时间内 YCK09360-60的所有数据。这种需求设置scan的startrow=‘YCK09360-60_时间戳’,endrow=‘YCK09360-60_时间戳’,即可。

2) 查询某段时间内的所有9011D6L00124 的数据。这种需求下,根据scan rowkey连续的原则,这种需求设置scan的startrow=‘YCK09360-60_时间戳_9011D6L00124 ’,endrow=‘YCK09360-60_时间戳_9011D6L00124 ’,即可。

但是,如果将vin放在前面,如下所示,适应性就差一些,如下所示案例2:

9011D6L00124-YCK09360-60-1638290481900    434.79011D6L00124-YCK09360-60-1638290482900    76.19011D6L00124-YCK09360-60-1638290483900    18.69011D6L00124-YCK09360-60-1638290484900    150.19011D6L00124-YCK09360-60-1638290485900    96.19011D6L00124-YCK09360-60-1638290586900    35.7

1)查询某段时间内的所有9011D6L00124 的数据。这种需求下,设置scan的startrow=‘9011D6L00124-YCK09360-60-时间戳,endrow=‘9011D6L00124-YCK09360-60-时间戳’,即可。

2) 查询某段时间内 YCK09360-60的所有数据。这种需求设置scan是要取的YCK09360-60小所有的vin号并放在rowkey的最前段,启动多个scan 去扫描多组数据

HBase的rowkey安装字典序顺序排列 从小到大,所以需要最新数据时需要翻转时间戳或者自增id  ,所以在使用时间戳字段是最好是使用long.maxvalue-timestamp/1000 ,这样保证最新的数据总是在较新的位置,方便读取

预分区的设置也是由必要的,防止数据热点问题.,可以使用hash取余的方式去关键分区字段,保证了分区均匀性

所以最后设计的方案

分区字段-标识字段-标识字段-long.maxvalue-timestamp

其他我觉得有意义的点

减少列族及减少数据存储的开销,必要时减少限定符 ,直接将数据写成单独一条,其余处理代码中进行分割.

在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,HBase storefiles中的索引(有助于随机访问)会占据HBase分配的大量内存,因为具体的值和它的key很大。可以增加block大小使得storefiles索引再更大的时间间隔增加,或者修改表的模式以减小rowkey和列名的大小。压缩也有助于更大的索引。

控制rowkey在16个字节以下 并维持在8的整数倍,符合64位系统的8字节对齐 ,最大不要超过64位

业务访问中权重高的key放在前面

例如URLRecords表的主要用途是用来计算当天的URL访问排名。根据业务需求,需要访问某天的所有URL,因此date是主键,权重更高,放在前面,而URL则放在后面。

构造冗余数据

例如,percontent的数据包含了URL Records的数据,URL Records的数据是冗余存储的,区别在于percontent的URL放在date前面,而URL Records表的URL放在date后面。这就是由于URL在满足不同需求的时候,权重不同,由于URL Records需要的数据量不大,因此采用冗余的机制解决该矛盾。权衡需求的重要性和系统忍受度选择一种方案当两种需求有矛盾,但其中一方属于次要需求,并且在系统忍受度范围之内的话,可以舍弃一种方案。优先满足需求更强的一方

Rowkey的时间属性问题

循环key使用(1)存在问题如果rowkey中有时间属性,并且随着时间的增加,rowkey会不断的增大下去的话,会造成region数量不断地增加。如果使用TTL来控制数据的生命周期,一些老的数据就会过期,进而导致老的region数据量会逐渐减少甚至成为空的region。这样一方面region总数在不断增加,另外一方面老的region在不断的成为空的region,而空的region不会自动合并,进而造成过多空的region占用负载和内存消耗的情况。(2)解决办法这种情况下,可以使用循环key的方法来解决。思路是根据数据的生命周期设定rowkey的循环周期,当一个周期过去以后,通过时间映射的方法,继续使用老的过期数据的rowkey。例如,key的格式如下:YY-MM-DD-URL。如果数据的生命周期是一年,则可以使用MM-DD-URL的格式。这样当前一年过去以后,数据已经老化,后一年的数据可以继续写入前一年的位置,使用前一年数据的rowkey。这样可以避免空的region占用资源的情况。

根据hbase的原理,key的周期需要至少比TTL大2* hbase.hregion.majorcompaction(默认24小时)的时间,才能够保证过期的数据能够在key循环回来之前得到完全清理。按照时间周期进行建表的方式也可以解决空region的问题,和循环key方法相比较,循环key的优点如下:

操作简单,不需要重复建表,系统自动处理

同样,循环key具有如下劣势:

需要使用TTL来老化数据,可能会增加compact负担

需要保证查询操作不会查询到过期数据,否则会影响系统性能。

如果在系统压力不是特别大,需要长期运行,能够控制查询不会查询到过期数据的场景下,建议使用TTL+循环key的方式,否则建议使用按照时间周期进行建表的方式。

通过rowkey设计来控制并发度

在相同业务模式下,不同的rowkey设计系统的并发度不一样。和按天建表的思路类似,通过rowkey控制并发度的原则是激活的region总数适中,每个regionserver的激活Region数大于1,小于(写操作内存/flushsize)为宜。

为了实现这一点,可以将可枚举、数量有限的属性放在rowkey的前面,时间放在后面的方式来提高并发度;通过将大粒度的时间属性(如天、小时等)放在rowkey前面,数量很大的可枚举属性(如电话号码、URL等)放在后面的方法来控制激活的region数。

电信手机行业案例

案例一xx_yy_zz_时间戳xx为分区字段 必须散列yy 和zz为标识查询字段  若可枚举按照字段枚举个数从小到大 方便查询时间戳为最好查询字段标识若表的用途是为了统计当天数据 可以将年月日放入rowkey 并排在yy之前场景题使用场景:电信案例:查询某个人(手机号)某年[某月某日](时间)的通话详情。1) 预分区(1) 评估未来半年到一年的数据增长,不让其自动分区(10G)(2) 确定分区键00| 01| 02| ...000| 001| ...2) 设计RowKey(1) 确定分区号   (散列性)00_ 01_ 02_...​手机号%分区数            不够散列(手机号+年月日)%分区数   按照月份、年进行查询  不方便(手机号+年月)%分区数(2) 拼接字段     (唯一性、长度)XX_手机号_时间戳XX_手机号_年月日 时分秒XX_时间戳_手机号XX_年月日 时分秒_手机号(3) 校验13412341234 2021-09-07XX_手机号_年月日 时分秒startRow:05_13412341234_2021-09-07stopRow :05_13412341234_2021-09-0805_13412341234_2021-09-07|XX_年月日 时分秒_手机号startRow:05_2021-09-07 00:00:00_13412341234stopRow :05_2021-09-08 00:00:00_13412341234​13412341234 2021-09  2021-11XX_手机号_年月日 时分秒startRow:05_13412341234_2021-09stopRow :05_13412341234_2021-09|05_13412341234_2021-10​startRow:03_13412341234_2021-10stopRow :03_13412341234_2021-11​startRow:04_13412341234_2021-11stopRow :04_13412341234_2021-12      

HBase的RowKey设计原则含案例(全)相关推荐

  1. hbase的rowkey设计原则及热点问题

    1.1 hbase数据库介绍 1.简介 hbase是基于Google BigTable模型开发的,典型的key/value系统.是建立在hdfs之上,提供高可靠性.高性能.列存储.可伸缩.实时读写no ...

  2. Hadoop生态圈-Hbase的rowKey设计原则

    Hadoop生态圈-Hbase的rowKey设计原则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/ ...

  3. HBase的rowkey设计原则、HBase避免热点 11

    1. 唯一性原则 每条数据的rowkey必须唯一,不重复 2. 长度原则 rowkey尽量越短越好,一般不要超过16字节 原因 数据的持久化文件HFlie中是按照KeyValue存储的,如果rowke ...

  4. Hbase rowkey设计原则,热点问题

    rowKey的作用 读写数据时通过 RowKey 找到对应的 Region: MemStore 中的数据按 RowKey 字典顺序排序: HFile 中的数据按 RowKey 字典顺序排序. rowk ...

  5. HBase之Rowkey设计总结与实战篇

    HBase之Rowkey设计总结与实战篇 一.引言 HBase由于其存储和读写的高性能,在OLAP即时分析中越来越发挥重要的作用,在易观精细化运营产品–易观方舟也有广泛的应用.作为Nosql数据库的一 ...

  6. HBase之Rowkey设计总结及易观方舟实战篇

    置顶 2018年06月02日 21:52:46 代立冬 阅读数:1699 标签:  Rowkey设计经验hbase经验总结易观方舟rowkey设计实践rowkey实战 更多 个人分类: ●HBase- ...

  7. 【Hbase】(十一)详解 HBase 表的设计原则

    文章目录 一.建表高级属性 1. BLOOMFILTER 2. VERSIONS 3. COMPRESSION 4. TTL 5. alter 6. describe/desc 7. disable_ ...

  8. rowKey设计原则

    rowkey设计原则 a.唯一原则 一定要保证当前的rowkey是所有数据的唯一一行 b.长度原则 在满足唯一原则的基础上,尽可能的减少rowk的容量大小 如果rowkey有特殊的排序需求的时候,要补 ...

  9. Hbase Rowkey设计原则

    Hbase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这三个维度可以对HBase中的数据进行快速定位 ...

最新文章

  1. YUV 后面数字的含义_高速公路标示牌上的字母和数字,到底什么意思?很多人都不知道...
  2. 程序员法律考试(5)-民法(2)
  3. 【bzoj3631】[JLOI2014]松鼠的新家
  4. 使用Eric构建Caffe应用程序-Baby年龄识别
  5. Angular应用的router-outlet使用一个例子
  6. oracle共享服务器模式的图,Oracle 11g笔记——专有服务器、共享服务器模式
  7. 动态照片墙 python 实现_利用python生成照片墙的示例代码
  8. clickhouse CollapsingMergeTree表引擎
  9. Hibernate 与 Mybatis 如何共存?打破你的认知!
  10. 剑指_3.2不修改数组找出重复的数字(Python)
  11. 遗传算法的C语言代码
  12. 机顶盒 img打包工具_网络机顶盒刷机、固件升级图文详解 宏旺半导体包教包会...
  13. 10.原码、反码、补码
  14. javascript英语单词音节拆分_拆分音节拼读法解析
  15. 如何通过虚拟机和真实网线调试设备
  16. 狂欢,不过是一群人的孤单--来自人人
  17. 用pycharm制做简单的音乐播放
  18. 博学谷-数据分析matplotlib
  19. 人工智能之无人驾驶技术到底是怎么回事
  20. GO笔记之为什么要学习GO

热门文章

  1. 服务器容易维修吗,服务器维修简单吗
  2. 车牌识别计算机应用领域,计算机视觉和模式识别在车牌识别中的应用
  3. 登录注册——注册输入验证
  4. MySQL中间件Atlas安装及使用
  5. 使用kubeadm安装部署1.21.3版本Kubernetes
  6. https双向认证訪问管理后台,採用USBKEY进行系统訪问的身份鉴别,KEY的证书长度大于128位,使用USBKEY登录...
  7. MySQL 清除表碎片空间
  8. 政府频频施压,58同城依旧我行我素,虚假信息顽疾无解?
  9. java出现无法读取_Java无法读取字体
  10. Excel表格批量将文本转换为超链接 批量文本转链接 一键转URL