Changes between Version 1 and Version 2 of hbase_table_design


Ignore:
Timestamp:
09/13/2012 11:57:16 AM (14 years ago)
Author:
liaojiaohe
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • hbase_table_design

    v1 v2  
    1       1、表的属性 
    2       (1)最大版本数:通常是3,如果对于更新比较频繁的应用完全可以设置为1,能够快速的淘汰无用数据,对于节省存储空间和提高查询速度有效果。不过这类需求在海量数据领域比较小众。 
    3       (2)压缩算法:可以尝试一下最新出炉的snappy算法,相对lzo来说,压缩率接近,压缩效率稍高,解压效率高很多。 
    4       (3)inmemory:表在内存中存放,一直会被忽略的属性。如果完全将数据存放在内存中,那么hbase和现在流行的内存数据库memorycached和redis性能差距有多少,尚待实测。 
    5       (4)bloomfilter:根据应用来定,看需要精确到rowkey还是column。不过这里需要理解一下原理,bloomfilter的作用是对一个region下查找记录所在的hfile有用。即如果一个region下的hfile数量很多,bloomfilter的作用越明显。适合那种compaction赶不上flush速度的应用。 
    6       2、rowkey 
    7        rowkey是hbase的key-value存储中的key,通常使用用户要查询的字段作为rowkey,查询结果作为value。可以通过设计满足几种不同的查询需求。 
    8       (1)数字rowkey的从大到小排序:原生hbase只支持从小到大的排序,这样就对于排行榜一类的查询需求很尴尬。那么采用rowkey = Integer.MAX_VALUE-rowkey的方式将rowkey进行转换,最大的变最小,最小的变最大。在应用层再转回来即可完成排序需求。 
    9       (2)rowkey的散列原则:如果rowkey是类似时间戳的方式递增的生成,建议不要使用正序直接写入rowkey,而是采用reverse的方式反转rowkey,使得rowkey大致均衡分布,这样设计有个好处是能将regionserver的负载均衡,否则容易产生所有新数据都在一个regionserver上堆积的现象,这一点还可以结合table的预切分一起设计。 
    10       3、columnfamily 
    11       columnfamily尽量少,原因是过多的columnfamily之间会互相影响。 
    12       4、column 
    13       对于column需要扩展的应用,column可以按普通的方式设计,但是对于列相对固定的应用,最好采用将一行记录封装到一个column中的方式,这样能够节省存储空间。封装的方式推荐protocolbuffer。 
     1      1、表的属性[[BR]] 
     2 
     3      (1)最大版本数:通常是3,如果对于更新比较频繁的应用完全可以设置为1,能够快速的淘汰无用数据,对于节省存储空间和提高查询速度有效果。不过这类需求在海量数据领域比较小众。[[BR]] 
     4 
     5      (2)压缩算法:可以尝试一下最新出炉的snappy算法,相对lzo来说,压缩率接近,压缩效率稍高,解压效率高很多。[[BR]] 
     6 
     7      (3)inmemory:表在内存中存放,一直会被忽略的属性。如果完全将数据存放在内存中,那么hbase和现在流行的内存数据库memorycached和redis性能差距有多少,尚待实测。[[BR]] 
     8 
     9      (4)bloomfilter:根据应用来定,看需要精确到rowkey还是column。不过这里需要理解一下原理,bloomfilter的作用是对一个region下查找记录所在的hfile有用。即如果一个region下的hfile数量很多,bloomfilter的作用越明显。适合那种compaction赶不上flush速度的应用。[[BR]] 
     10 
     11      2、rowkey[[BR]] 
     12 
     13       rowkey是hbase的key-value存储中的key,通常使用用户要查询的字段作为rowkey,查询结果作为value。可以通过设计满足几种不同的查询需求。[[BR]] 
     14 
     15      (1)数字rowkey的从大到小排序:原生hbase只支持从小到大的排序,这样就对于排行榜一类的查询需求很尴尬。那么采用rowkey = Integer.MAX_VALUE-rowkey的方式将rowkey进行转换,最大的变最小,最小的变最大。在应用层再转回来即可完成排序需求。[[BR]] 
     16 
     17      (2)rowkey的散列原则:如果rowkey是类似时间戳的方式递增的生成,建议不要使用正序直接写入rowkey,而是采用reverse的方式反转rowkey,使得rowkey大致均衡分布,这样设计有个好处是能将regionserver的负载均衡,否则容易产生所有新数据都在一个regionserver上堆积的现象,这一点还可以结合table的预切分一起设计。[[BR]] 
     18 
     19      3、columnfamily[[BR]] 
     20 
     21      columnfamily尽量少,原因是过多的columnfamily之间会互相影响。[[BR]] 
     22 
     23      4、column[[BR]] 
     24 
     25      对于column需要扩展的应用,column可以按普通的方式设计,但是对于列相对固定的应用,最好采用将一行记录封装到一个column中的方式,这样能够节省存储空间。封装的方式推荐protocolbuffer。[[BR]] 
    1426      
    15      以下会分场景介绍一些特殊的表结构设计方法,只是一些摸索,欢迎讨论: 
    16       value数目过多场景下的表结构设计: 
    17        目前我碰到了一种key-value的数据结构,某一个key下面包含的column很多,以致于客户端查询的时候oom,bulkload写入的时候oom,regionsplit的时候失败这三种后果。通常来讲,hbase的column数目不要超过百万这个数量级。在官方的说明和我实际的测试中都验证了这一点。 
    18        有两种思路可以参考,第一种是单独处理这些特殊的rowkey,第二种如下: 
     27     以下会分场景介绍一些特殊的表结构设计方法,只是一些摸索,欢迎讨论:[[BR]] 
     28 
     29      value数目过多场景下的表结构设计:[[BR]] 
     30 
     31       目前我碰到了一种key-value的数据结构,某一个key下面包含的column很多,以致于客户端查询的时候oom,bulkload写入的时候oom,regionsplit的时候失败这三种后果。通常来讲,hbase的column数目不要超过百万这个数量级。在官方的说明和我实际的测试中都验证了这一点。[[BR]] 
     32 
     33       有两种思路可以参考,第一种是单独处理这些特殊的rowkey,第二种如下:[[BR]] 
     34 
    1935      可以考虑将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~~")即可。