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期间创建的文件),文件名(“中国好声音”),分类(“综艺”),所有者(“浙江卫视”)。
假设当前我们一共有如下文件:
内容列表 ID CreateTime Name Category UserID 1 2 3 4 5 6 7 8 9 10
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 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表结构设计。
http://san-yun.iteye.com/blog/1995829
相关推荐
《HBase的Rowkey设计详解》 HBase作为一种高性能的分布式NoSQL数据库,因其在OLAP实时分析中的卓越性能而受到广泛关注。其核心特性之一便是通过Rowkey进行数据查询,因此Rowkey的设计对于HBase的读写性能至关重要。...
一个良好的RowKey设计能够保证数据的快速访问和均匀分布,从而避免热点问题。热点问题指的是大量请求集中于某些特定的RowKey,导致这些节点负载过高,影响整体系统性能。 在本案例中,"Equidistribution.java"可能...
HBase RowKey 设计与协处理器运用 HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。本文将详细介绍 HBase 的 RowKey 设计和协处理器运用。 HBase 的介绍 HBase 是一...
"大数据性能调优之HBase的RowKey设计" 大数据功能调优之HBase的RowKey设计是指在HBase中对RowKey的设计,以提高HBase的性能和可扩展性。RowKey是HBase中的一种二进制码流,可以是任意字符串,最大长度为64kb,但...
除了RowKey设计之外,索引在HBase中也是提升查询效率的重要手段。HBase的索引主要分为二级索引和组合索引。二级索引是通过在HBase中创建一个或多个额外的索引表来实现的,它可以用来优化对非RowKey字段的快速查询。...
用户历史订单列表查询rowkey设计技巧 最左前缀原则
2)、RowKey散列原则:如果RowKey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将RowKey的高位作为散列字段,由程序循环生成,低位放时间
以下是关于HBase Rowkey设计的一些关键知识点: 1. 唯一性原则:Rowkey必须确保全局唯一,避免数据冲突。这可以通过结合业务主键和时间戳或者哈希值来实现。 2. 长度原则:Rowkey应尽可能短,一般建议不超过16个...
在IT行业中,尤其是在大数据处理领域,...总之,理解并掌握HBase的RowKey设计和索引策略是提升HBase性能的关键。在实际工作中,我们需要根据数据的特性和查询模式,灵活运用各种设计技巧,确保系统的稳定和高效运行。
总之,HBase的RowKey设计是一个平衡各种因素的过程,包括数据类型转换、排序规则、散列性和存储效率。通过巧妙地设计RowKey和利用自定义比较器,可以优化多条件查询,提高系统的整体性能。然而,这种方法并不适用于...
更重要的是,合理设计rowkey,因为HBase是基于rowkey的字典顺序进行存储的。rowkey的设计应尽量短小,以减少存储空间的消耗和提高查询效率。 客户端调优涉及多个参数。例如,设置scanner缓存大小可以减少对服务器的...
【HBase数据库设计】 HBase是一种基于列存储的分布式数据库,它是Apache Hadoop生态系统的一部分,设计用于处理海量数据。HBase的主要特征包括: 1. **分布式存储**:HBase构建在Hadoop的HDFS(Hadoop Distributed...
有效的RowKey设计对于HBase的性能至关重要。良好的RowKey设计可以减少热点问题,提高查询效率。以下是一些RowKey设计的通用原则: 1. **避免热点问题**:确保RowKey的分布尽可能均匀,避免所有访问集中在少数几个...
│ Hbase表中rowkey及列簇的设计 │ Hbase表设计-微博案例的表设计 │ Hbase表设计-微博案例的业务实现 │ Hbase列簇属性的介绍 │ Hbase性能优化-GC调优 │ Hbase性能优化-内存管理 │ Hbase性能优化-flush、...
通过精心设计RowKey、优化查询模式以及建立健全的监控体系,可以在实际业务场景中有效利用HBase的强大功能。同时,也需要注意到HBase的局限性,如不支持复杂的事务处理等,在选择技术栈时需结合具体业务需求进行综合...
本文将详细介绍 HBase 多表关联查找的知识点,涵盖了 HBase 表结构设计、rowkey 设计、columnfamily 设计、column 设计等方面的内容,并结合实际应用场景,提供了一些实用的设计方法和思路。 1. 表的属性 HBase 表...