首页 > 其他分享 >hbase - [06] rowkey的设计

hbase - [06] rowkey的设计

时间:2024-03-28 15:22:06浏览次数:31  
标签:06 字节 反转 region key rowkey hbase 数据

 

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

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

1、通过get方式,指定rowkey获取唯一一条记录

2、通过scan方式,设置startRow和stopRow参数进行范围匹配。

3、全表扫描,即直接扫描整张表中所有行记录。

 

 

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。

热点发生在大量client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。

大量访问会使热点region所在的单个机器超过自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求。为避免写热点,设计rowkey使得不同行在同一个region,但是在更多数据情况下,数据应该被写入集群的多个region,而不是一个。

下面是一些常见的避免热点的方法及优缺点。

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

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

反转:第三种防止热点的方法时反转固定长度或者数字格式的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 - 结束时间]

 

 

 

— 要养成终生学习的习惯 —

标签:06,字节,反转,region,key,rowkey,hbase,数据
From: https://www.cnblogs.com/houhuilinblogs/p/18101777

相关文章

  • hbase - [04] java访问hbase
     需要导入jar包$HBASE_HOME/lib下的所有jar包$HADOOP_HOME/share/hadoop/common的所有jar包 packagecom.harley.hbase.test;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.NamespaceDescriptor;importorg.apache.hadoop.hbase.Tabl......
  • hbase - [03] 客户端常用命令(hbase shell)
     1、列出所有namespacelist_namespace2、创建namespacecreate_namespace'ns_name'3、修改namespace属性alter_namespace'nsname',{METHOD=>'set','PROPERTY_NAME'=>'PROPERTY_VALUE'}4、删除namespace属性alter_namesp......
  • hbase - [02] 分布式安装部署
      一、角色规划主机名node01node02node03node04Zookeeper○○○ NameNode○○  JournalNode○○○ DataNode○○○○ResourceManager○○  NodeManager○○○○Master○○○ RegionServer○○○○......
  • HBase 学习
    HBase基本概念HBase的存储是基于Hadoop的。Hadoop实现了一个分布式文件系统(HDFS)。HDFS有高容错性的特点,被设计用来部署在低廉的硬件上,而且它提供高吞吐量以访问应用程序的数据,适合那些有着超大数据集的应用程序。基于Hadoop意味着HBase与生俱来的超强的扩展性和吞吐......
  • 06-python异常和模块
    异常语法try:可能会错误的代码except:出现了异常,异常处理else:没有出现异常,处理,通常可以不写finally:无论有无异常,都运行实例:try:f=open("e:/a.txt","r",encoding="UTF-8")#文件不存在,不可度,会有异常exceptFileNotFoundErrorase:......
  • 2006 年考研英语真题 - 阅读 4 解析
    2006 年考研英语真题 - 阅读 4 解析Manythingsmakepeoplethinkartistsareweird.[1]  翻译:很多事情让人们觉得艺术家很奇怪。1.makesb.dosth 使某人做某事。2.artistsareweird. 是省略引导词的从句,作 think 的宾语。Buttheweirdestmaybethis:......
  • 2006 年考研英语真题 - 翻译题解析
    2006 年考研英语真题 - 翻译题解析IsittruethattheAmericanintellectualisrejectedandconsideredofnoaccountinhissociety?[1] 翻译:难道美国的知识分子被嫌弃,在社会中不受重视吗?1.it 是形式主语,代指后面的 that 从句。2.Americanintellectual 美......
  • 手把手教你用python一键抢12306火车票(附代码)
    哈喽,哈喽~,一年一度的抢火车票大战正式拉开序幕…然饿大多数人碰到的是这种情况:当你满心期待摩拳擦掌准备抢票的时候,你会发现一票难求!想回趟家真难!那么作为程序猿的你,当然要用程序猿的方式来抢票!下面分享用python来抢票!网站提供各种免费资源!城市cookie可根据具体需求自行添加!链......
  • MBR4060DC-ASEMI肖特基二极管MBR4060DC
    编辑:llMBR4060DC-ASEMI肖特基二极管MBR4060DC型号:MBR4060DC品牌:ASEMI封装:TO-263最大平均正向电流(IF):40A最大循环峰值反向电压(VRRM):60V最大正向电压(VF):0.85V工作温度:-65°C~150°C反向恢复时间:ns重量:1.38克芯片个数:2芯片尺寸:130mil正向浪涌电流(IFMS):300AMBR4060DC特性:耐......
  • 洛谷 P8306 【模板】字典树
    写模板:1确定树的节点指针数量2确定起始字符3实现插入方法4根据题目编写求解方法,或者添加计数元素到节点中structNode{array<int,100>next{};intcnt=0;};classTrie{public:Trie(charstart):start_(start),root_(0){trie_.resize(1)......