Hbase Rowkey设计

因为一直在做hbase的应用层面的开发,所以体会的比较深的一点是hbase的表结构设计会对系统的性能以及开销上造成很大的区别,本篇文章先按照hbase表中的rowkey、columnfamily、column、timestamp几个方面进行一些分析。最后结合分析如何设计一种适合应用的高效表结构。

1、表的属性

(1)最大版本数:通常是3,如果对于更新比较频繁的应用完全可以设置为1,能够快速的淘汰无用数据,对于节省存储空间和提高查询速度有效果。不过这类需求在海量数据领域比较小众。

(2)压缩算法:可以尝试一下最新出炉的snappy算法,相对lzo来说,压缩率接近,压缩效率稍高,解压效率高很多。

(3)inmemory:表在内存中存放,一直会被忽略的属性。如果完全将数据存放在内存中,那么hbase和现在流行的内存数据库memorycached和redis性能差距有多少,尚待实测。

(4)bloomfilter:根据应用来定,看需要精确到rowkey还是column。不过这里需要理解一下原理,bloomfilter的作用是对一个region下查找记录所在的hfile有用。即如果一个region下的hfile数量很多,bloomfilter的作用越明显。适合那种compaction赶不上flush速度的应用。

2、rowkey

rowkey是hbase的key-value存储中的key,通常使用用户要查询的字段作为rowkey,查询结果作为value。可以通过设计满足几种不同的查询需求。

(1)数字rowkey的从大到小排序:原生hbase只支持从小到大的排序,这样就对于排行榜一类的查询需求很尴尬。那么采用rowkey = Integer.MAX_VALUE-rowkey的方式将rowkey进行转换,最大的变最小,最小的变最大。在应用层再转回来即可完成排序需求。

(2)rowkey的散列原则:如果rowkey是类似时间戳的方式递增的生成,建议不要使用正序直接写入rowkey,而是采用reverse的方式反转rowkey,使得rowkey大致均衡分布,这样设计有个好处是能将regionserver的负载均衡,否则容易产生所有新数据都在一个regionserver上堆积的现象,这一点还可以结合table的预切分一起设计。

3、columnfamily

columnfamily尽量少,原因是过多的columnfamily之间会互相影响。

4、column

对于column需要扩展的应用,column可以按普通的方式设计,但是对于列相对固定的应用,最好采用将一行记录封装到一个column中的方式,这样能够节省存储空间。封装的方式推荐protocolbuffer。

以下会分场景介绍一些特殊的表结构设计方法,只是一些摸索,欢迎讨论:

value数目过多场景下的表结构设计:

目前我碰到了一种key-value的数据结构,某一个key下面包含的column很多,以致于客户端查询的时候oom,bulkload写入的时候oom,regionsplit的时候失败这三种后果。通常来讲,hbase的column数目不要超过百万这个数量级。在官方的说明和我实际的测试中都验证了这一点。

有两种思路可以参考,第一种是单独处理这些特殊的rowkey,第二种如下:

可以考虑将column设计到rowkey的方法解决。例如原来的rowkey是uid1,,column是uid2,uid3...。重新设计之后rowkey为<uid1>~<uid2>,<uid1>~<uid3>...当然大家会有疑问,这种方式如何查询,如果要查询uid1下面的所有uid怎么办。这里说明一下hbase并不是只有get一种随机读取的方法。而是含有scan(startkey,endkey)的扫描方法,而这种方法和get的效率相当。需要取得uid1下的记录只需要new Scan("uid1~","uid1~~")即可。

这里的设计灵感来自于hadoop world大会上的一篇文章,这篇文章本身也很棒,推荐大家看一下http://www.cloudera.com/resource/hadoop-world-2011-presentation-slides-advanced-hbase-schema-design/

拓展阅读:

HBase 在淘宝的应用和优化  http://www.iteye.com/magazines/83

时间: 2024-10-10 16:22:41

Hbase Rowkey设计的相关文章

Hbase rowkey设计一

转自 http://blog.csdn.net/lifuxiangcaohui/article/details/40621067 hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储. 1.rowkey,我们知道rowkey是行的主键,而且hbase只能用个rowkey,或者一个rowkey范围即scan来查找数据.所以 rowkey的设计是至关重要的,关系到你应

HBase学习(十八)Hbase rowkey设计一

hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储. 1.rowkey,我们知道rowkey是行的主键,而且hbase只能用个rowkey,或者一个rowkey范围即scan来查找数据.所以 rowkey的设计是至关重要的,关系到你应用层的查询效率.我们知道,rowkey是以字典顺序排序的.而存储的字节码,字典排序,我们知道,如果是字 母,那就是字母的顺序,比如

Hbase Rowkey设计原则

Hbase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这三个维度可以对HBase中的数据进行快速定位. Hbase中Rowkey可以唯一标识一行记录,在Hbase查询的时候,有以下几种方式: 1.通过get方式,指定rowkey获取唯一一条记录 2.通过scan方式,设置StartRow和EndRow参数进行范围匹配 3.全表扫描,即直接扫描整张表中所有行记录 Rowkey长度原则 rowkey是

HBase rowkey设计实例

需求:绘制渠道用户的每日趋势(每分钟一组数据一天1440组,2000+个渠道,区分新/老用户,2*1440*2000+=576万+/每天),需要保存90天. 查询条件:渠道号.新or老用户.日期 rowkey:渠道_日期_新or老用户_小时分钟(hhmm) 连接HBase from thrift.protocol import TBinaryProtocol from thrift.transport import TSocket from thrift.transport import TTr

HBase的rowkey设计(含实例)

转自:http://www.aboutyun.com/thread-7119-1-1.html 对于任何系统的数据设计,我们都想提高性能,达到资源最大化利用,那么对于hbase我们产生如下问题: 1.hbase rowkey设计如何才能提高性能?2.hbase rowkey如何设计才能散列到不同的节点上? 访问hbase table中的行,只有三种方式: 1 通过单个row key访问2 通过row key的range3 全表扫描 文中可能涉及到的API: Hadoop/HDFS:http://

Hbase中rowkey设计原则

Hbase中rowkey设计原则 1.热点问题 在某一时间段,有大量的数据同时对一个region进行操作 2.原因 对rowkey的设计不合理 对rowkey的划分不合理 3.解决方式 rowkey是hbase的读写唯一标识 最大长度是64KB. 4.核心原则 设计必须按照业务需求进行设计 5.长度原则 经验:10~100字节可以 官方:16字节,因为操作系统时8字节进行存储 6.散列原则 划分region是按照rowkey的头部进行划分. 有几种方式: )组合字段 id+timestamp )

HBase Rowkey的散列与预分区设计

转自:http://www.cnblogs.com/bdifn/p/3801737.html 问题导读:1.如何防止热点?2.如何预分区?扩展:为什么会产生热点存储? HBase中,表会被划分为1...n个Region,被托管在RegionServer中.Region二个重要的属性:StartKey与EndKey表示这个Region维护的rowKey范围,当我们要读/写数据时,如果rowKey落在某个start-end key范围内,那么就会定位到目标region并且读/写到相关的数据.简单地说

HBase的RowKey设计

HBase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定位. HBase中rowkey可以唯一标识一行记录,在HBase查询的时候,有两种方式: 通过get方式,指定rowkey获取唯一一条记录 通过scan方式,设置startRow和stopRow参数进行范围匹配 全表扫描,即直接扫描整张表中所有行记录 rowkey长度原则 rowkey是一个二进制码

hbase 利用rowkey设计进行多条件查询

摘要 本文主要内容是通过合理Hbase 行键(rowkey)设计实现快速的多条件查询,所采用的方法将所有要用于查询中的列经过一些处理后存储在rowkey中,查询时通过rowkey进行查询,提高rowkey的利用率,加快查询速度.行键(rowkey)并不是简单的把所有要查询的列的值直接拼接起来,而是将各个列的数据转成整型(int)数据来存储.之后实现两个自定义的比较器(comparator):一个是相等比较器,用于实现类似于SQL的多条件精确查找功能. select * from table wh