没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
hbase 表结构设计研究
因为一直在做 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 一对多关系的表结构设计
前面刚开始使用 HBase 只是用于存取某些简单的 JAVA 对象或是简单数据,所以一般设置
列族和列标示时只用一个就行了。H
最近有个任务是把系统中的站内消息移到 HBase 当中去,才开始查 HBase 中的一对多
关系,发现网上的资料讲的都不甚详尽,这篇 blog 记录一下我的设计和想法,这些想法毕
竟未经证实,尚需验证。如果有大虾认为有不妥甚至错误的地方请不吝指教。H
首先讲两个我参考的资料,背景:一个主贴和 N 个回帖的一对多关系,学过一点数据库
的应该都能体会到,图我就不画了:H
1.官方推荐资料:H
http://wiki.apache.org/hadoop/Hbase/DataModel
2.一位大大的简单 HBase 一对多表结构的介绍(感觉实际上他参考了资料 1,不过讲的不
太。。合理,而且下面列表的那个 comment_title 应该是写错了,一对多的那个例子貌似
也让人很不解):H
http://doudouclever.blog.163.com/blog/static/17511231020127893233972/
最终的解决方案是这个表(按照官方资料):H
Table
Row
Key
Family Attributes(ColumnKeys/Qualifiers)
BlogTable ID info: Author,Title,URL
text: No ColumnKey,3version
comment
title:
Column keys are written like YYYMMDDHHmmss.
Should be IN-MEMORY and have a 1 version
comment
author:
Same keys. 1 Version
comment
text:
Same keys. 1 Version
因为刚开始看的是第二个资料,官方资料也没细看,导致理解偏差了。一直想明白这个一
对多是怎么设计的,其实了解以下两个知识点就可以了:H
1.HBase 的二维表结构:三个重要概念是 Column Family(以下简称为 CF)和 Column
Key/Qualifier(以下简称为 CK)还有 RowKey。一个 CF 可以包含若干个 CK。相当于 CF
是个合并单元格;CK 才是具体的列标示,并且可以为空。Rowkey 就是行标示,可以理解
为主键。如下图所示:H
2.Hbase 中,对于某个 Column Family 中的 Column Key 是可以动态增加的H
存储于关系型数据库中的数据如下,简单起见某些字段删减了:H
表头H
ID Author Title Body
剩余10页未读,继续阅读
资源评论
- szfbair1132016-06-14还是可以下载,谢谢
- shiwoshiwo_12019-06-11写的不错,可以参考
- qq_168941032016-07-21作为了解参考一下,有资源参考比没有强
nma_123456
- 粉丝: 43
- 资源: 100
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功