hbase表结构设计研究

news/2024/7/5 3:14:40

  因为一直在做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/

转载于:https://www.cnblogs.com/ylqmf/archive/2012/05/17/2506410.html


http://www.niftyadmin.cn/n/673100.html

相关文章

PHP成员变量作用域的限制-private

使用PHP编写个类,我们应该尽量避免动态改变类的成员变量,而将成员变量作用于定位private,使用get和set方法来获取这些成员变量,如 1 <html>2 <body>3 <?php4 class Man {5 private $name;6 7 …

资产注入概念股

600676&#xff0c;交运股份收购控股股东相关资产上海交运集团公司.600246&#xff0c;万通先锋收购万通时尚股权。600528&#xff0c;中铁二局收购集团公司相关资产。600820&#xff0c;隧道股份对高桥随道机械增资。600547&#xff0c;山东黄金收购集团公司相关资产。000562&…

Moon.ORM 3.8 发布 支持sqlite代码生成器 一些BUG修改 附带demo 可以直接运行

下载地址:/Files/humble/Moon-ORM-3.8.7z使用说明:http://www.cnblogs.com/humble/archive/2012/04/08/2437752.html相关问题及版权和自述:http://www.cnblogs.com/humble/archive/2012/05/20/2510756.html它的不同之处和优点:http://www.cnblogs.com/humble/archive/2012/04/0…

Windbg命令学习13(ln和伪寄存器)

1.ln ln 命令显示给定地址处的或者最近的符号。 ln表示list near&#xff0c;ln命令将尽可能地给出与特定地址相关的符号&#xff0c;如果没有符号能够精确地与这个地址匹配&#xff0c;那么调试器将通过指针算法对靠近这地址的符号进行运逄&#xff0c; 并返回运算结果符号 0:…

求字符串中不含重复字符的最长子串的长度

题目&#xff1a;求字符串最长不含重复字符的子串长度&#xff0c;如abcbec&#xff0c;就返回3. 分析&#xff1a; 利用动态规划(DP)原理&#xff0c;设字符串S的长度为n&#xff0c;考虑i...n-1这个后缀中符合条件的子串&#xff1a;首先需要记录两组数据&#xff0c;第一组数…

理财周报特别策划:关注601开头的大股票

http://www.sina.com.cn 2007年09月09日 20:48 理财周报大象起舞&#xff0c;独步武林。以“601”开头的25只股票&#xff0c;理财周报称之为“601大股票”。 “601”股票代码最早于2006年5月底正式使用。探询“601”的存在意义已无必要&#xff0c;关键是“601”能带来什么。理…

(原)linux下编译microhttpd库(一个c/c++的http服务端库)

下载库&#xff1a; http://www.gnu.org/software/libmicrohttpd/这里有简单的该库介绍以及使用方法&#xff08;简略&#xff09;。下载&#xff1a;$ svn checkout https://gnunet.org/svn/libmicrohttpd/使用手册&#xff1a;http://www.gnu.org/software/libmicrohttpd/mic…

9月10日金股

http://www.jrj.com  2007年09月07日 17:44 金融界网站 【字体&#xff1a;大 中 小】 【页面调色版 】 走 势摘 要 厦华电子&#xff08;行情,资讯&#xff09;(600870)&#xff1a;随着电子行业利润持续、高速增长&#xff0c;特别是数字电视的不断推广&#xff0c;公司…