HBase的RowKey设计
HBase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定位。
HBase中rowkey可以唯一标识一行记录,在HBase查询的时候,有两种方式:
通过get方式,指定rowkey获取唯一一条记录
通过scan方式,设置startRow和stopRow参数进行范围匹配
全表扫描,即直接扫描整张表中所有行记录
rowkey长度原则
rowkey是一个二进制码流,可以是任意字符串,最大长度 64kb ,实际应用中一般为10-100bytes,以 byte[] 形式保存,一般设计成定长。
建议越短越好,不要超过16个字节,原因如下:
数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。
目前操作系统都是64位系统,内存8字节对齐,控制在16个字节,8字节的整数倍利用了操作系统的最佳特性。
rowkey散列原则
如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。
rowkey唯一原则
必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。
什么是热点
HBase中的行是按照rowkey的字典顺序排序的,这种设计优化了scan操作,可以将相关的行以及会被一起读取的行存取在临近位置,便于scan。然而糟糕的rowkey设计是热点的源头。 热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求。 设计良好的数据访问模式以使集群被充分,均衡的利用。
为了避免写热点,设计rowkey使得不同行在同一个region,但是在更多数据情况下,数据应该被写入集群的多个region,而不是一个。
下面是一些常见的避免热点的方法以及它们的优缺点:
加盐
这里所说的加盐不是密码学中的加盐,而是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。
哈希
哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据
反转
第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。
反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题
时间戳反转
一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用 Long.Max_Value - timestamp 追加到key的末尾,例如 [key][reverse_timestamp] , [key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。
比如需要保存一个用户的操作记录,按照操作时间倒序排序,在设计rowkey的时候,可以这样设计
[userId反转][Long.Max_Value - timestamp],在查询用户的所有操作记录数据的时候,直接指定反转后的userId,startRow是[userId反转][000000000000],stopRow是[userId反转][Long.Max_Value - timestamp]
如果需要查询某段时间的操作记录,startRow是[user反转][Long.Max_Value - 起始时间],stopRow是[userId反转][Long.Max_Value - 结束时间]
其他一些建议
尽量减少行和列的大小在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,甚至可以和具体的值相比较,那么你将会遇到一些有趣的问题。HBase storefiles中的索引(有助于随机访问)最终占据了HBase分配的大量内存,因为具体的值和它的key很大。可以增加block大小使得storefiles索引再更大的时间间隔增加,或者修改表的模式以减小rowkey和列名的大小。压缩也有助于更大的索引。
列族尽可能越短越好,最好是一个字符
冗长的属性名虽然可读性好,但是更短的属性名存储在HBase中会更好。
HBase的常用shell命令
https://blog.csdn.net/scutshuxue/article/details/6988348
HBase通过java api或Hbase shell修改表的列簇
https://blog.csdn.net/zhangshk_/article/details/78826026

如果知道hbase数据表的key的分布情况,就可以在建表的时候对hbase进行region的预分区。这样做的好处是防止大数据量插入的热点问题,提高数据插入的效率。

步骤:
1.规划hbase预分区

首先就是要想明白数据的key是如何分布的,然后规划一下要分成多少region,每个region的startkey和endkey是多少,然后将规划的key写到一个文件中。比如,key的前几位字符串都是从0001~0010的数字,这样可以分成10个region,划分key的文件如下:
0001|
0002|
0003|
0004|
0005|
0006|
0007|
0008|
0009|
为什么后面会跟着一个"|“,是因为在ASCII码中,”|"的值是124,大于所有的数字和字母等符号,当然也可以用“~”(ASCII-126)。分隔文件的第一行为第一个region的stopkey,每行依次类推,最后一行不仅是倒数第二个region的stopkey,同时也是最后一个region的startkey。也就是说分区文件中填的都是key取值范围的分隔点,如下图所示:

2.hbase shell中建分区表,指定分区文件

可以通过指定SPLITS_FILE的值指定分区文件,如果分区信息比较少,也可以直接用SPLITS分区。我们可以通过如下命令建一个分区表,指定第一步中生成的分区文件:
create ‘split_table_test’, ‘cf’, {SPLITS_FILE => ‘region_split_info.txt’}

下面,我们登陆一下master的web页面Hmaster:60010,查看一下hbase的表信息,找到刚刚新建的预分区表,进入查看region信息:

我们看到第一个region是没有startkey的,最后一个region是没有stopkey的

HBase的表设计笔记相关推荐

  1. HBase 的表设计

    1 ColumnFamily 设计 追求的原则是:在合理的范围内能尽量少的减少列簇就尽量减少列簇. 最优设计是:将所有相关性很强的 Key-Value 都放在同一个列簇下,这样既能做到查询效率最高,也 ...

  2. 走向云计算之HBase模式设计及表设计案例

    一.概述 HBase有以下几个特点: HBase列的可以动态增加,并且列为空就不存储数据,节省存储空间. hbase自动切分数据,使得数据存储自动具有水平scalability. Hbase可以提供高 ...

  3. HBase表设计介绍

    概述 在不久的过去,大数据的应用越来越多.为了支持这些应用以及扩展老的应用,很多新的数据管理系统被开发出来,被称作大数据革命.这些系统中很多都是开源和社区驱动的.Apache Hbase就是这样的一个 ...

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

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

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

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

  6. HBase概念学习(八)开发一个类twitter系统之表设计

    这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...

  7. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引

    1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...

  8. 大数据之路读书笔记-11事实表设计

    大数据之路读书笔记-11事实表设计 文章目录 大数据之路读书笔记-11事实表设计 11.1 事实表基础 11.1.1 事实表特性 11.1.2 事实表设计原则 11.1.3 事实表设计方法 11.2 ...

  9. 合理设计及优化HBase数据库表入门

    在完成创建HBase数据库后我们后续最重要的工作就是如何设计和构建出合理高效的hbase表.那么接下来本文就将介绍一下如何设计及优化HBase数据库的表.OK,废话不再多说,接下来我们进入今天的正题~ ...

最新文章

  1. 2021年自然语言处理学习路线!
  2. nagios全攻略(一)----准备阶段
  3. windows 下执行mysql脚本_Windows下批处理执行MySQL脚本文件
  4. 字符串16进制之间相互转换(转载)
  5. sqlite 常用数据类型
  6. 为什么计算机桌面显示器,电脑显示屏不显示是怎么回事 电脑显示屏不显示如何解决【详细介绍】...
  7. 打破国外垄断,开发中国人自己的编程语言(1):编写解析表达式的计算器
  8. BackgroundWorker DoWork事件调用多次的问题
  9. java 出路 xls_java读取excel之xlsl超大文件
  10. js遇到的wasm的加密
  11. 对Excel选择性粘贴中的跳过空单元选项容易造成的两种误解
  12. 不积跬步,无以至千里
  13. 大学实验室面试总结(机器学习)
  14. qq邮箱如何在win10邮箱连接到服务器,win10自带邮箱如何使用?win10自带邮箱如何同步qq邮箱邮件?...
  15. 人力资源数据分析(python)
  16. java map扩容机制_Java HashMap的原理、扩容机制、以及性能思考
  17. Public Key Infrastructure
  18. 前端切页快速上手系列
  19. FMDB数据库的升级
  20. 统计正数和负数的个数然后计算这些数的平均值_人人都是数据分析师之统计分析...

热门文章

  1. mysqldump导出insert语句
  2. 重点检查重要部分的代码检查清单
  3. 解决cannot import name ‘XXX‘ from partially initialized module ‘XXX‘ (most likely due to a circular...
  4. portlet lifecycle
  5. leetcode-帕斯卡三角形
  6. 亿万用户网站MySpace的成功秘密(转)
  7. 第 5 篇:用视图集,简化你的代码
  8. 哈尔滨工业大学计算机考研854真题-哈尔滨工业大学 2017年硕士研究生入学考试试题
  9. Metrics介绍和Spring的集成
  10. 医院计算机网络故障护士,医院信息系统护士工作站运行中的管理 【护理相关讨论版】...