你好,游客 登录 注册 搜索
背景:
阅读新闻

HBase表结构设计笔记

[日期:2016-02-19] 来源:Edagarli's Blog  作者: [字体: ]

  在设计HBase表时,Rowkey设计是很重要的事情,应该基于预期的访问模式来为Rowkey建模。

  Rowkey非常重要,在设计时需要慎重考虑。以存储用户观影记录数据为例,复合的Rowkey由用户ID作为前缀(方便把某用户的观影记录聚合在一起),倒置的时间串作为Rowkey的后缀可以使观影记录数据从新到旧排列。如果Rowkey是整型的,用二进制的方式应该比用String来存储一个数据更节约空间。

  Rowkey进行设计需要的注意要点。

  1.Rowkey是以字典顺序从大到小排序。

  2.Rowkey尽量散列Rowkey设计。

  最重要的是要保证散列,这样就会保证所有的数据都不是在一个Region上,从而避免读写的时候负载会集中在个别Region上。从而避免读写的时候负载会集中在个别Region上。

  假设我们需要存储一个视频网站用户的所有观影记录(暂时不需要考虑时间倒排),这时候的Rowkey可设计为userid_videoid的拼接字符串,但是这样设计的话,userid的分布就很可能不均匀,因此Rowkey是按字符串排序的(默认字典顺序排序)。

  有3种办法来解决这个问题,具体如下:

  一.反转userid,将userid字符串反转后存储。

  二.散列userid,即对userid进行散列。

  三.userid取模后进行MD5加密,取前6位作为前缀加入到userid前面。

  假设某视频网站的用户正在观看视频,但此时,要开辟一个新栏目,所有的用户观影记录都按照时间倒排序展示在这个栏目中。这个时候,就需要为原来的userid_vedioid建立一张索引表,并且这个表的Rowkey要和时间相关。

  Rowkey设计可以使用当前时间(观影时间)的Long值作为Rowkey的前缀。另外建议Rowkey最好都是String:一是方便线上使用Shell查数据,排查错误;二是更容易让数据均匀分布;三是不必考虑存储成本。

  3.Rowkey的长度尽量短。

  如果Rowkey太长,第一存储开销会增加,影响存储效率;第二内存中Rowkey字段过长,会导致内存的利用率降低,进而降低索引命中率。

  一般的做法是:

  时间使用Long来表示。尽量使用编码压缩。

 

  如果觉得还不错,赏点酒钱!





收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款