什么情况下使用HBase

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

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

适合海量的,但同时也是简单的操作(例如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,…”

好处:

便于分布

便于多条件伸缩查询

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-20 21:52:49

什么情况下使用HBase的相关文章

在linux+eclipse+maven环境下调试Hbase服务源码,启动Hmaster

由于论文工作,想在regionserver的ipcserver和hregionserver等类进行修改源码的工作. 所以我需要在我的虚拟机中,我的虚拟机环境是32位centos中安装eclipse,调试Hbase的源码. 搭建环境主要步骤基本按照http://www.cnblogs.com/shitouer/archive/2012/10/24/2736923.html来进行.我主要记录下我自己搭建环境遇到的问题. 我的基本步骤, 1,eclipse按照svn插件, 2,通过svn拉去tag中的

[Hbase]eclipse下操作hbase

ubuntu14.04,eclipse下操作hbase.下面是一个利用hbase java api操作hbase,查看hbase中表student1列族情况的example: import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumn

es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的.很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了.第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒.你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对

python3 在文件确实存在的情况下,运行提示找不到文件

提示 [Errno 2] No such file or directory: 但是路径下确实存在此文件,在不改动的情况下,再次运行,执行成功. 百思不得其解,看到此链接下的回答 http://bbs.csdn.net/topics/391934998?page=1 尝试使用 os.path.normpath() 替换os.path.join(),先记录待测试.

MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案,因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的场景的,同时,面对能够达到优化的方式要追究其原因,同样的做法,换了个场景,达不到优化效果的,还要追究其原因.个人对此场景在不用情况表示怀疑,然后自己测试了一把,果然发现一些问题,同时也证实了一些预期的想法.

MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引

mysql explain的使用: http://blog.csdn.net/kaka1121/article/details/53394426 索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表 代码如下: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  ); 我们随机向里面插入了10000条记录,其中有一条:5555, admin. 在查找use

如何在主机自动IP而虚拟机静态IP的情况下相互ping通?

这两天在学习Linux,用xshell时,发现主机和虚拟机均不能相互ping通.自己查了一下主机是自动获取IP,而虚拟机是静态IP(默认静态).并且,虚拟机选用的是桥接方式.折腾了一会儿终于ping通了. 环境: 主机OS: win10 网络: 有线 虚拟机:VMware12.5.0 OS: RHEL 5.8 注: 一般情况下,主机默认为自动获取IP,VMware桥接情况下默认为静态IP. 步骤: (1) 给虚拟机Network Adapter设置Bridge方式,前提是虚拟机在关机情况下. 然

把cookie以json形式返回,用js来set cookie.(解决手机浏览器未知情况下获取不到cookie)

1.继上一篇随笔,链接点我,解决手机端cookie的问题. 2.上次用cookie+redis实现了session,并且手机浏览器可能回传cookies有问题,所以最后用js取出cookie跟在请求的url后面. 3.但是今天发现了新的问题,js取cookie存的sessionId为空,情况如下: (1)QQ浏览器能获取某些cookie,另一些cookie获取为空,猜测是后台Response SetCookie的时候,手机端浏览器没能良好的接受. (2)UC浏览器测试正常. (3)Safari情

Jackson高并发情况下,产生阻塞

情况:在高并发情况下,查看线程栈信息,有大量的线程BLOCKED. 从线程栈得知,线程栈中出现了阻塞,锁在了com.fasterxml.jackson.databind.ser.SerializerCache.untypedValueSerializer(SerializerCache.java:74)上. 1 "catalina-exec-1453" #1525 daemon prio=5 os_prio=0 tid=0x00007f1010098800 nid=0x2675 wai