什么情况下使用HBase

时间:2022-12-16 22:34:02

成熟的数据分析主题,查询模式已经确立并且不轻易改变

传统的关系型数据库已经无法承受负荷,高速插入,大量读取

适合海量的,但同时也是简单的操作(例如value-key)

 

场景一:浏览历史

关系数据库的困难:

  简单的事情只要上了量就会变得无比复杂的事情

 

  Orderby耗费很多性能

 

  大量发生,但又无法分布式处理

 

  顾客需要实时看到自己的足迹,因此不能使用缓存技术

 

HBase迎接挑战

  天生就是面向时间戳的查询

 

  行键的设计非常关键(因为HBase里面没有去重,关联等操作)。基于行键的查询异常迅速,特别是最近的数据被存放在内存的memstore里,完全没有IO开销

 

  分布式化解负荷

 

模式设计:

  行键:user_id

  列族和列:book:bookid

  为了充分利用分布式,可以用reverse key,hash等技巧改造行键

 

场景二:商品推荐

使用关系型数据库实现:

  设计一个log表,包含用户名,时间戳和书id三列

  selecta.threadid,count(distinct a.userid) from testtj a,testtj b

   where a.userid =  b.userid

    and b.threadid = 1479820

  groupby a.threadid order by 2 desc  limit 10;

 

使用HBase

表设计与查询实现(后面还有一种方法,复合行键)

  两个表,一个是u-t,另一个是t-u

  u-t表的结构:行键为userid,列族和列为thread:threaded

  t-u表结构:行键为threadid,列族和列为user:userid

  查询:先从t-u表从threadid -> userid,再在u-t表从

userid -> threaded,在计算程序中实现去重(mapreduce)和统计功能。

 

关系型数据库辅助索引:

  例子:学生表(学号,身份证号,姓名,性别),有时在学号上查询,有时在身份证号上查询

  主表:行键为学号,列族为学生,下面的列是身份证号,姓名,性别等

  辅助(索引)表:行键为身份证号,列族和列为学号

复合行键设计:

   原表:

         <userid>:<colfamily>:<messageid>:<timestamp>:<email-message>

12345:data:232f22f2-f22f2f-f2-f2f2f2f:1307097848:”HiLars,…”

……………..

复合行键索引表:

<userid>-<messageid>:<colfamily>:<timestamp>:<email-message>

12345-232f22f2-f22f2f-f2-f2f2f2f:data: 1307097848:”Hi Lars,…”

 

           好处:

                 便于分布

                 便于多条件伸缩查询