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

HBase中rowkey可以唯一标识一行记录,在HBase查询的时候,有以下几种方式:

  1. 通过get方式,指定rowkey获取唯一一条记录
  2. 通过scan方式,设置startRow和stopRow参数进行范围匹配
  3. 全表扫描,即直接扫描整张表中所有行记录

1 rowkey长度原则

rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存,一般设计成定长。

建议越短越好,不要超过16个字节,原因如下:

  1. 数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
  2. MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。

2 rowkey散列原则

如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。

3 rowkey唯一原则

必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

4什么是热点

HBase中的行是按照rowkey的字典顺序排序的,这种设计优化了scan操作,可以将相关的行以及会被一起读取的行存取在临近位置,便于scan。然而糟糕的rowkey设计是热点的源头。

热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求。

设计良好的数据访问模式以使集群被充分,均衡的利用。为了避免写热点,设计rowkey使得不同行在同一个region,但是在更多数据情况下,数据应该被写入集群的多个region,而不是一个。下面是一些常见的避免热点的方法以及它们的优缺点:

1加盐

这里所说的加盐不是密码学中的加盐,而是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。

2哈希

哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。

3反转

第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。

反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题

3时间戳反转

一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用 Long.Max_Value - timestamp 追加到key的末尾,例如 [key][reverse_timestamp] , [key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。

其他一些建议:

尽量减少行键和列族的大小在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,这个时候它们将会占用大量的存储空间。

列族尽可能越短越好,最好是一个字符。

冗长的属性名虽然可读性好,但是更短的属性名存储在HBase中会更好。

HBase的rowKey设计技巧相关推荐

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

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

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

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

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

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

  4. 修改HBase的rowkey设计把应用的QPS从5W提升到50W

    摘要: 正确设计Hbase的rowkey可以让你的应用飞起来,前提是你需要了解一些Hbase的存储机制. UTT是Aliexpress的营销消息运营平台,运营希望促销活动时APP消息推送的QPS达到3 ...

  5. HBase的RowKey设计

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

  6. HBase的RowKey设计原则含案例(全)

    前言 HBase的RowKey的行由行键按字典顺序排序,这样的设计优化了扫描,允许存储相关的行或者那些将被一起读的邻近的行.然而,设计不好的行键是导致 hotspotting 的常见原因.当大量的客户 ...

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

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

  8. [HBase进阶]--rowkey设计要点(官方文档介绍)

    官方文档说明 http://hbase.apache.org/book.html#rowkey.design 一.Hotspotting(热点效应) 1.hbase是字典排序,这是一种优化扫描的方式, ...

  9. 90-50-010-源码-hbase的rowkey设计

    1.视界 1. rowKey编码概述 ​ 注:Kylin源码分析系列基于Kylin的2.6.0版本的源码,其他版本可以类比. 2. 相关概念 ​ 前面介绍了Kylin中Cube构建的流程,但Cube数 ...

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

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

最新文章

  1. Python 源码函数格式带有*和/说明
  2. android radiobutton 分组,Android 第十课——UI RadioButton
  3. 揭开Socket编程的面纱
  4. matlab模拟风场竖桥向时程,索梁结构应急桥抖振响应分析
  5. 字节码中的两个方法init,clinit
  6. 图普科技招聘有关深度学习的解题?
  7. PCA与LDA算法的解释,浅显易懂
  8. 零基础学Python-爬虫-2、scrapy框架(测试案例篇·技术点在后面文章内讲解)【测试将一篇小说的所有访问路径与标题存储到一个文件下】
  9. 汽车电子专业知识篇(三)-双目视觉三大应用视觉深度、标定、立体匹配
  10. ASP.NET MVC Filter过滤机制(过滤器、拦截器)
  11. Python gevent学习笔记 1
  12. 关于js数组的六种算法---水桶排序,冒泡排序,选择排序,快速排序,插入排序,希尔排序的理解。...
  13. 关于Oracle针对中文的md5加密
  14. spark配置lzo
  15. 即时通讯领域必将最终由XMPP协议一统天下
  16. 数中唯一只出现一次的数字
  17. Redis高可用方案:sentinel(哨兵模式)以及springboot整合sentinel模式
  18. 一位计算机牛人的心得,谈计算机和数学
  19. oracle补丁冲突解决方法,【学习笔记】Oracle RAC升级安装patch补丁的问题和解决办法...
  20. 圣水盆景区是闾山最著名的景点

热门文章

  1. 如何裁剪动态图片?教你三步快速裁剪GIF
  2. 腾讯云 python接口_Python 服务端集成 腾讯云 IM 服务
  3. A Pareto-Efficient Algorithm for Multiple Objective Optimization in E-Commerce Recommendation阅读翻译
  4. ArduinoUNO实战-第十四章-LM35温度传感器和DS18B20温度传感器
  5. 【微信公众号】2、申请微信公众平台接口测试帐号
  6. 汤明哲混沌大学厦门开讲 行业大咖助阵一起探讨战略管理
  7. 以下不正确的C语言标识符是( ),以下不正确的C语言标识符是 _____。
  8. js【点击 div 2s 后颜色变成『粉色」】
  9. vue-element-admin-master 在线教育 - 【4】你用 POI,我已经用 EasyExcel 了+课程科目管理
  10. Stream.sorted