Author:Pirate Leohtml
myBlog: http://blog.csdn.net/pirateleo/apache
myEmail: codeevoship@gmail.comapi
转载请注明出处,谢谢。oop
文中可能涉及到的API:post
Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/性能
HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.htmlspa
Begin!.net
HBase的查询实现只提供两种方式:设计
一、按指定RowKey获取惟一一条记录,get方法(org.apache.hadoop.hbase.client.Get)code
二、按指定的条件获取一批记录,scan方法(org.apache.hadoop.hbase.client.Scan)
实现条件查询功能使用的就是scan方式,scan在使用时有如下几点值得注意:
一、scan能够经过setCaching与setBatch方法提升速度(以空间换时间);
二、scan能够经过setStartRow与setEndRow来限定范围。范围越小,性能越高。
经过巧妙的RowKey设计使咱们批量获取记录集合中的元素挨在一块儿(应该在同一个Region下),能够在遍历结果时得到很好的性能。
三、scan能够经过setFilter方法添加过滤器,这也是分页、多条件查询的基础。
下面举个形象的例子:
咱们在表中存储的是文件信息,每一个文件有5个属性:文件id(long,全局惟一)、建立时间(long)、文件名(String)、分类名(String)、全部者(User)。
咱们能够输入的查询条件:文件建立时间区间(好比从20120901到20120914期间建立的文件),文件名(“中国好声音”),分类(“综艺”),全部者(“浙江卫视”)。
假设当前咱们一共有以下文件:
ID | CreateTime | Name | Category | UserID |
---|---|---|---|---|
1 | 20120902 | 中国好声音第1期 | 综艺 | 1 |
2 | 20120904 | 中国好声音第2期 | 综艺 | 1 |
3 | 20120906 | 中国好声音外卡赛 | 综艺 | 1 |
4 | 20120908 | 中国好声音第3期 | 综艺 | 1 |
5 | 20120910 | 中国好声音第4期 | 综艺 | 1 |
6 | 20120912 | 中国好声音选手采访 | 综艺花絮 | 2 |
7 | 20120914 | 中国好声音第5期 | 综艺 | 1 |
8 | 20120916 | 中国好声音录制花絮 | 综艺花絮 | 2 |
9 | 20120918 | 张玮独家专访 | 花絮 | 3 |
10 | 20120920 | 加多宝凉茶广告 | 综艺广告 | 4 |
这里UserID应该对应另外一张User表,暂不列出。咱们只需知道UserID的含义:
1表明 浙江卫视; 2表明 好声音剧组; 3表明 XX微博; 4表明 赞助商。
调用查询接口的时候将上述5个条件同时输入find(20120901,20121001,"中国好声音","综艺","浙江卫视")。
此时咱们应该获得记录应该有第一、二、三、四、五、7条。第6条因为不属于“浙江卫视”应该不被选中。
咱们在设计RowKey时能够这样作:采用UserID + CreateTime + FileID组成rowKey,这样既能知足多条件查询,又能有很快的查询速度。
须要注意如下几点:
一、每条记录的RowKey,每一个字段都须要填充到相同长度。假如预期咱们最多有10万量级的用户,则userID应该统一填充至6位,如000001,000002...
二、结尾添加全局惟一的FileID的用意也是使每一个文件对应的记录全局惟一。避免当UserID与CreateTime相同时的两个不一样文件记录相互覆盖。
按照这种RowKey存储上述文件记录,在HBase表中是下面的结构:
rowKey(userID 6 + time 8 + fileID 6) name 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会影响查询性能,在真正处理海量数据时会消耗很大的资源,且须要较长的时间。
在后续的博文中我将多举几种应用场景下rowKey的,能够知足简单条件下海量数据瞬时返回的查询功能)
若是须要分页还能够再加一个PageFilter限制返回记录的个数。
以上,咱们完成了高性能的支持多条件查询的HBase表结构设计。
——————————————————————————
by the way:
近期有时间会写一份Sample补充在这篇博文里,有须要的同窗能够持续关注。
后续的几篇关于HBase功能实现贴也陆续写做中。
HBase数据实现按期定量删除功能:http://blog.csdn.net/pirateleo/article/details/7964859
HBase在处理中文字符串时的问题:http://blog.csdn.net/pirateleo/article/details/7957109
陆续补充中……