《OD学HBase》20160820

时间:2021-03-27 05:17:16

一、案例

微博:

微博内容:

关注用户和粉丝用户: 添加或移除关注用户

查看关注用户的微博内容

微博数据存储:

响应时间 秒级 无延迟

(1)mysql分布式

(2)hbase数据库

使用HBase数据库实现微博系统数据的存储

表的设计:

命名空间:weibo

1. 微博内容表

TableName: weibo:weibo-content

RowKey:用户ID_timestamp

列簇:cf

列标签: cf:content,cf:title,cf:photo

版本设计:只需要保留一个版本

2. 用户关系表

TableName: weibo:relations

rowkey: 用户iID

列簇:

attend 关注用户

fan 粉丝用户

列标签:使用用户ID作为列标签,值为用户ID

rowkey   attend          fan

0001       attend:0002=0002           fan:0004=0004

          attend:0003=0003           fan:0004=0004

版本设计:只需要保留一个版本

3. 用户微博内容接收邮件箱表

TableName: weibo:receive-content-email

Rowkey:用户ID

列簇:cf

列标签:

直接使用用户ID,vlaue值取微博内容的rowkey

版本设计:设置最大版本为1000

rowkey  cf

00001  cf:0002=0002_2132455

     cf:0002=0002_2132456

1)rowkey设计:

(1)唯一性

(2)长度: 最大64kb。rowkey是hbase中表数据冗余产生的因素

10~100 字节

最好 8字节 16字节 64位操作系统

(3)散列原则:

假如 时间戳_用户ID 作为rowkey

10亿用户同时发微博,

1456777_000001

1456778_000002

1456778_100000

问题: 集中到某个region,造成这单独几个region负载量偏大,而其他region完全没有负载

散列: 尽量将某一时刻内的数据均衡分散到所有Region中(大部分Region)中

热点现象:数据在某一个时刻集中存储到某一两个Region上

rowkey设计规范;

方便查询,尽可能讲查询字段放到rowkey,HBase根据rowkey查询速度是最快。

2)列簇设计:

HBase面向列簇存储

region起始rowkey --- 终止rowkey范围内一个列簇下的数据

hdfs上的一个文件

StoreFile === HFile

跨列簇查询,速度相对较慢

一般设计一到两个列簇

HBase中的缓存

memstore: 写缓存

blockcache:块缓存,读缓存

HBase表单元格版本号:插入数据的时候如果没有单独制定,系统默认使用时间戳作为版本号。也可以自己制定时间戳。

Get查询单行记录,Scan查询多行记录