`
san_yun
  • 浏览: 2663723 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

HBase的rowkey设计

 
阅读更多

访问hbase table中的行,只有三种方式:

1 通过单个row key访问

2 通过row key的range

3 全表扫描

Hadoop Sequence File

 

Author:Pirate Leo

myBlog: http://blog.csdn.net/pirateleo/

myEmail: codeevoship@gmail.com

转载请注明出处,谢谢。

文中可能涉及到的API:

Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/

HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.html

Begin!

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表结构设计。

分享到:
评论
3 楼 kiss_0128 2015-01-08  
champion2008 写道
不错的设计,之前我也试过,但是如果在条件中不指定userid,有时间过滤的话,就不好使用setstartrow来过滤了,有可能需要全表扫描了。请问楼主有没有解决过这个问题?

2 楼 champion2008 2014-09-23  
不错的设计,之前我也试过,但是如果在条件中不指定userid,有时间过滤的话,就不好使用setstartrow来过滤了,有可能需要全表扫描了。请问楼主有没有解决过这个问题?
1 楼 di1984HIT 2014-06-09  
挺好,学习了。

相关推荐

    hbase的Rowkey设计方案.pdf

    《HBase的Rowkey设计详解》 HBase作为一种高性能的分布式NoSQL数据库,因其在OLAP实时分析中的卓越性能而受到广泛关注。其核心特性之一便是通过Rowkey进行数据查询,因此Rowkey的设计对于HBase的读写性能至关重要。...

    rowkey设计案例.zip

    一个良好的RowKey设计能够保证数据的快速访问和均匀分布,从而避免热点问题。热点问题指的是大量请求集中于某些特定的RowKey,导致这些节点负载过高,影响整体系统性能。 在本案例中,"Equidistribution.java"可能...

    hbase的rowkey设计与hbase的协处理器运用.docx

    HBase RowKey 设计与协处理器运用 HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。本文将详细介绍 HBase 的 RowKey 设计和协处理器运用。 HBase 的介绍 HBase 是一...

    大数据性能调优之HBase的RowKey设计.docx

    "大数据性能调优之HBase的RowKey设计" 大数据功能调优之HBase的RowKey设计是指在HBase中对RowKey的设计,以提高HBase的性能和可扩展性。RowKey是HBase中的一种二进制码流,可以是任意字符串,最大长度为64kb,但...

    HBase-RowKey与索引设计(高清)

    除了RowKey设计之外,索引在HBase中也是提升查询效率的重要手段。HBase的索引主要分为二级索引和组合索引。二级索引是通过在HBase中创建一个或多个额外的索引表来实现的,它可以用来优化对非RowKey字段的快速查询。...

    HBase分页查询的rowkey设计技巧

    用户历史订单列表查询rowkey设计技巧 最左前缀原则

    bitcarmanlee#easy-algorithm-interview-and-practice#Hbase rowkey

    2)、RowKey散列原则:如果RowKey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将RowKey的高位作为散列字段,由程序循环生成,低位放时间

    Hbase总结.docx

    以下是关于HBase Rowkey设计的一些关键知识点: 1. 唯一性原则:Rowkey必须确保全局唯一,避免数据冲突。这可以通过结合业务主键和时间戳或者哈希值来实现。 2. 长度原则:Rowkey应尽可能短,一般建议不超过16个...

    2-2+HBase-RowKey+与索引设计.zip

    在IT行业中,尤其是在大数据处理领域,...总之,理解并掌握HBase的RowKey设计和索引策略是提升HBase性能的关键。在实际工作中,我们需要根据数据的特性和查询模式,灵活运用各种设计技巧,确保系统的稳定和高效运行。

    Hbase行键设计(rowkey)实现多条件查询

    总之,HBase的RowKey设计是一个平衡各种因素的过程,包括数据类型转换、排序规则、散列性和存储效率。通过巧妙地设计RowKey和利用自定义比较器,可以优化多条件查询,提高系统的整体性能。然而,这种方法并不适用于...

    HBASE调优 rowkey

    更重要的是,合理设计rowkey,因为HBase是基于rowkey的字典顺序进行存储的。rowkey的设计应尽量短小,以减少存储空间的消耗和提高查询效率。 客户端调优涉及多个参数。例如,设置scanner缓存大小可以减少对服务器的...

    HBase数据库设计.doc

    【HBase数据库设计】 HBase是一种基于列存储的分布式数据库,它是Apache Hadoop生态系统的一部分,设计用于处理海量数据。HBase的主要特征包括: 1. **分布式存储**:HBase构建在Hadoop的HDFS(Hadoop Distributed...

    hbase原理和设计

    有效的RowKey设计对于HBase的性能至关重要。良好的RowKey设计可以减少热点问题,提高查询效率。以下是一些RowKey设计的通用原则: 1. **避免热点问题**:确保RowKey的分布尽可能均匀,避免所有访问集中在少数几个...

    大数据开发之案例实践Hbase的设计及企业优化视频教程(视频+讲义+笔记+配置+代码+练习)

    │ Hbase表中rowkey及列簇的设计 │ Hbase表设计-微博案例的表设计 │ Hbase表设计-微博案例的业务实现 │ Hbase列簇属性的介绍 │ Hbase性能优化-GC调优 │ Hbase性能优化-内存管理 │ Hbase性能优化-flush、...

    阿里HBase业务设计实践

    通过精心设计RowKey、优化查询模式以及建立健全的监控体系,可以在实际业务场景中有效利用HBase的强大功能。同时,也需要注意到HBase的局限性,如不支持复杂的事务处理等,在选择技术栈时需结合具体业务需求进行综合...

    HBase多表关联查找资料

    本文将详细介绍 HBase 多表关联查找的知识点,涵盖了 HBase 表结构设计、rowkey 设计、columnfamily 设计、column 设计等方面的内容,并结合实际应用场景,提供了一些实用的设计方法和思路。 1. 表的属性 HBase 表...

Global site tag (gtag.js) - Google Analytics