其他分享
首页 > 其他分享> > hbase行键(rowkey)设计

hbase行键(rowkey)设计

作者:互联网

1.概念

HBase是采用KeyValue的列存储,Rowkey就是KeyValue的Key,表示唯一行(和mysql主键概念类似)。

Rowkey是一段二进制码流(就是以二进制形式存储),最大长度为64KB,内容可以由使用的用户自定义。

HBase是根据Rowkey来进行检索的,系统通过找到某个Rowkey (或者某个 Rowkey 范围)所在的Region,然后将查询数据的请求路由到该Region获取数据。

HBase的检索支持3种方式:

(1) 通过单个Rowkey访问,按照某个Rowkey键值进行get操作,获取唯一记录;

(2) 通过Rowkey的range进行scan,即通过设置startRowKey和endRowKey,在这个范围内进行扫描。这样可以按指定的条件获取一批记录;

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

 

2.部分键扫描
以下数据是hbase权威指南中示例
<userId>-<messageId> : <colfam> : <qualifier> : <timestamp> : <email-message>
12345-5fc38314-e290-ae5da5fc375d : data : : 1307097848 : "Hi Lars, ..."
12345-725aae5f-d72e-f90f3f070419 : data : : 1307099848 : "Welcome, and ..."
12345-cc6775b3-f249-c6dd2b1a7467 : data : : 1307101848 : "To Whom It ..."
12345-dcbee495-6d5e-6ed48124632c : data : : 1307103848 : "Hi, how are ..."

HBase 内部会按字典序找到第一个行键的位置(要么是起始键,要么是起始键的下一个键):<userId>-<lowest-messageId>,开始扫描这个用户的所有邮件,紧接着下一个用户的所有邮件,直至到扫描到结束键。

我们可以使用包含部分键的扫描机制设计出比较有效的左对齐索引,当一个字段被加到行键中,就多了一个可以检索的维度(注意检索必须包含从左到右的某几个字段):<userId>-<date>-<messageId>-<attachmentId>

ps:可以对比的理解,将mysql数据库为了查询效率增加索引与hbase中rowkey包含常用查询字段类比,hbase索引将索引包含在rowkey中,rowkey设计关系到查询效率。

 

3.分页

使用扫描可以很方便的遍历查询数据子集的行。可以设定起始键和终止键限制扫描的范围,同时在 Client 端添加 offset 和 limit 参数筛选数据。

过程如下:

1.在起始键位置打开一个扫描器
2.跳过 offset 数目的行
3.读取 limit 数码的行,并返回
4.关闭扫描器

 

4.rowkey设计原则

一条数据的唯一标识是 rowkey,这条数据存储于哪个分区,取决于 rowkey 处于哪个一个预分区的区间内,设计 rowkey 的主要目的 ,就是让数据均匀的分布于所有的 region 中

1. rowkey 长度原则
  Rowkey 是一个二进制码流,设计成定长的,且尽量短。

2. rowkey 散列原则
  如果 Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将 Rowkey 的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个 Regionserver 实现负载均衡的几率。

如果没有散列字段,首字段直接是时间信息将产生所有 新数据都在一个 RegionServer 上堆积的热点现象,这样在做数据检索的时候负载将会集中 在个别 RegionServer,降低查询效率。row key是按照字典序存储,

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

3. rowkey 唯一原则

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

 

5.辅助索引

hbase没有提供辅助索引

ps:这里辅助索引类似mysql非聚集索引,其实就是根据非聚集索引查询找到聚集索引进行数据获取

 

在辅助索引的实现技术上常用方案:
1. 表索引
使用单独的hbase表存储索引数据,业务表的索引列值做为索引表的rowkey,业务表的rowkey做为索引表的qualifier或value。

2. 列索引
与业务表使用相同表,使用单独列族存储索引,用户数据列值做为索引列族的Qualifier,用户数据Qualifier做为索引列族的列值。

两种方案都存在一定的问题,一个数据的一致性无法保证,一个使用在特定场景

关于这块现在一些技术中对Hbase相关联的技术扩展IHbase,ITHBase

 

 

 

 

 

 

 

标签:存储,行键,rowkey,扫描,索引,Rowkey,hbase,数据
来源: https://www.cnblogs.com/jessica888/p/14968666.html