HBase的rowkey设计

访问hbase table中的行,只有三种方式:
  1 通过单个row key访问
  2 通过row key的range
  3 全表扫描

文中可能涉及到的API:
Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/
HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.html

HBase的查询实现只提供两种方式:
  1、按指定RowKey获取唯一一条记录,get方法
  (org.apache.hadoop.hbase.client.Get)
  2、按指定的条件获取一批记录,scan方法
  (org.apache.hadoop.hbase.client.Scan)

实现条件查询功能使用的就是scan方式,scan在使用时有以下几点值得注意:
  1、scan可以通过setCaching与setBatch方法提高速度(以空间换时间);
  2、scan可以通过setStartRow与setEndRow来限定范围。范围越小,性能越高。
  通过巧妙的RowKey设计使我们批量获取记录集合中的元素挨在一起(应该在同一个Region下),可以在遍历结果时获得很好的性能。
  3、scan可以通过setFilter方法添加过滤器,这也是分页、多条件查询的基础。

下面举个形象的例子:
  我们在表中存储的是文件信息,每个文件有5个属性:文件id(long,全局唯一)、创建时间(long)、文件名(String)、分类名(String)、所有者(User)。
我们可以输入的查询条件:文件创建时间区间(比如从20120901到20120914期间创建的文件),文件名(“中国好声音”),分类(“综艺”),所有者(“浙江卫视”)。
假设当前我们一共有如下文件:
内容列表

IDCreateTimeNameCategoryUserID
20120902中国好声音第1期综艺1
20120904中国好声音第2期综艺1
20120906中国好声音外卡赛综艺1
20120908中国好声音第3期综艺1
20120910中国好声音第4期综艺1
20120912中国好声音选手采访综艺花絮2
20120914中国好声音第5期综艺1
20120916中国好声音录制花絮综艺花絮2
20120918张玮独家专访花絮3
20120920加多宝凉茶广告综艺广告4

这里UserID应该对应另一张User表,暂不列出。我们只需知道UserID的含义:
  1代表 浙江卫视; 2代表 好声音剧组; 3代表 XX微博; 4代表 赞助商。
  
  调用查询接口的时候将上述5个条件同时输入find(20120901,20121001,”中国好声音”,”综艺”,”浙江卫视”)。
  此时我们应该得到记录应该有第1、2、3、4、5、7条。第6条由于不属于“浙江卫视”应该不被选中。
  
  那么我们在设计RowKey时可以这样做:采用UserID + CreateTime + FileID组成rowKey,这样既能满足多条件查询,又能有很快的查询速度。

  需要注意以下几点:
  1、每条记录的RowKey,每个字段都需要填充到相同长度。假如预期我们最多有10万量级的用户,则userID应该统一填充至6位,如000001,000002…
  2、结尾添加全局唯一的FileID的用意也是使每个文件对应的记录全局唯一。避免当UserID与CreateTime相同时的两个不同文件记录相互覆盖。
  按照这种RowKey存储上述文件记录,在HBase表中是下面的结构:

rowKey(userID 6 + time 8 + fileID 6name    category ....
    00000120120902000001
    00000120120904000002
    00000120120906000003
    00000120120908000004
    00000120120910000005
    00000120120914000007
    00000220120912000006
    00000220120916000008
    00000320120918000009
    00000420120920000010

怎样用这张表?

  在建立一个scan对象后,我们设置起始行数setStartRow(00000120120901),setEndRow(00000120120914)。
  这样,scan时只扫描userID=1的数据,且时间范围限定在这个指定的时间段内,满足了按用户以及按时间范围对结果的筛选。并且由于记录集中存储,性能很好。
  
  然后使用

SingleColumnValueFilter
(org.apache.hadoop.hbase.filter.SingleColumnValueFilter)

  共4个,分别约束name的上下限,与category的上下限。满足按同时按文件名以及分类名的前缀匹配。(注意:使用SingleColumnValueFilter会影响查询性能,在真正处理海量数据时会消耗很大的资源,且需要较长的时间。)
  如果需要分页还可以再加一个PageFilter限制返回记录的个数。
  
以上,我们完成了高性能的支持多条件查询的HBase表结构设计。

文章转载自:
http://san-yun.iteye.com/blog/1995829

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值