Hbase笔记——RowKey设计

一)、什么情况下使用Hbase

1)传统数据库无法承载高速插入、大量读取。

2)Hbase适合海量,但同时也是简单的操作。

3)成熟的数据分析主题,查询模式确立不轻易改变。

二)、现实场景

1、电商浏览历史

 

           

问题:

传统数据库   

    数据量很大,事情会变得复杂。

    Order by 消耗很多性能。

大量发生又无法分布式处理,顾客需要事实看到自己足迹,传统数据库无法使用缓存。

Hbase

面向时间查询。

基于行健查询速度快,新产生数据存于内存中的memstore,完全没有IO开销。

分布式化解负荷。

思路:

RoeKeyuserid

列族和列:bookbookid

/如果用userid作为RowKey进行存储,会发生因Rowkey范围制动进行分配存储节点时会发生因范围过小而之分配到一个或几个节点上发挥不出分布式系统的性能,

 

****为了充分利用分布式可以进行reverse  keyHash技巧进行行健设计。

reverse  key    userid进行导置如 userid为 111213141516171819201112

进行reverse  key后会变成 211102918171615141312111.这样会随机画的分配到多个节点上。

Hash

userid进行hash生成hash值进行userid映射。

2、浏览XXXX贴子的人还浏览了XXX

Hbase实现

      两张表,u-tt-u

U-t结构:RowKeyuserid,列族和列threadthreadid

T-u结构:RowKeyuserid,列族和列useruserid

查询:t-u  threadid->userid   再从u-t userid->threadid,  获得笛卡尔积(会存在大量无用数据)在程序中去重和统计。

 

2、多条件查询

例子:Studentsno,cardid,sname,sex,age)有时以sno进行查询,有事以cardid进行查询。

   问题:传统型数据库中,一张中可以有多个字段为查询条件,但Hbase中只可以对Rowkey进行条件查询,

解决方案:主表 RowKeysno。列族为学生 列为  cardidname,sex,age.

          辅助表:RowKeycardid   列族和列为 sno

复合行键设计

例子;

     Userid (用户id)、 Messageid(邮件id)、<email-message>(邮件内容)

有时需要查询某人的所有邮件(Rowkeyuserid即可),有事又需要查询某人具体的邮件(userid和 Messageid为查询条件,如果邮件又1000+利用辅助表进行查询不是十分适合)利用复合行键 RowKeyuserid-Messageid    userid查询时,对RowKey进行分词,

    好处:便于分布式,便于多条件伸缩查询。

 

 

 

 

 



此随笔非原创



posted @ 2014-06-17 12:25  凯心宝牙  阅读(4403)  评论(0编辑  收藏  举报