基于Hbase的微博案例
需求
1、 发布微博内容
a. 在微博内容表中 添加一条数据(发布者)
b. 在微博内容接收邮件箱表对所有粉丝用户添加数据(订阅者)
scan 'weibo:receive-content-email',{VERSIONS=>5}
2、添加关注用户
a. 在微博用户关系表中 添加新的好友关注(attends)
b. 从被关注用户角度来说, 新增粉丝用户(fans)
c. 微博邮件箱表添加关注用户发布的微博内容
3、移除或者取消关注用户
a. 在微博用户关系表中 移除新的好友关注(attends)
b. 从被关注用户角度来说, 删除粉丝用户(fans)
c. 微博邮件箱表删除关注用户发布的微博内容
4、获取关注用户发布的微博内容
a. 从微博内容邮件表中获取该用户其关注用户的微博内容的rowkey
b. 根据上面获取到的微博内容的rowkey 获取微博内容
微博展示的内容信息:
message: 发布者ID , 时间戳 , content
表的设计
分析微博:
用户群体: 关注用户 和用户粉丝
用户行为: 发布微博、添加或者移除关注用户
数据存储: 分布式 mysql 数据库
考虑因素:响应时间 妙级 无延迟
对你的技术团队就是一个很大的考验
引出hbase 数据库存储 来实现响应时间 妙级 无延迟 、
hbase 是hadoop 的分布式数据库
使用数据库的时候
拦路虎: 表的设计(合理的来设计 因素多元化)
命名空间(类似于传统关系型数据库中的schema): 区分不同的业务表
namespace name:weibo
设计那些表:
a.微博内容表
xxx 发布 xx 内容
table name : weibo:content
rowkey: 被关注用户ID_时间戳
columnfamily: cf
colunmnlabel: (任意变化的)
图片
内容
标题
version: 只需要一个版本
rowkey:
a.唯一性 每条数据是唯一的
b.长度 (<=64 kb 建议 10-100 byte 最佳 8-16 byte)表 rowkey 是hbase中数据产生冗余的因素
c.散列原则
举例:
时间戳_用户ID 作为rowkey
大量的用户在同一时刻 发布微博内容
121_001
121_002
121_003
121_004
===>
集中到某个region 会造成单独几个region 负载量偏大 而其他 region 完全没有负载
d. 业务相关的设计规范:
方便查询 尽可能将查询知道放到 rowkey
列簇设计:
Hbase 是面向列簇存储 region start rowkey 到 stop rowkey 范围内的一个列簇下的数据 对应一个hdfs file 称为StoreFile 也可以称为HFile 所以如果跨列查询 速度相对来说就会慢很多 so 设计hbase 表 列簇的是 一般1-2个,(1个最佳)
b.用户关系表
用户id fans attends
table name : weibo:relations
rowkey: 用户ID(发布者的用户ID)
columnfamily: attends、fans
colunmnlabel:
关注用户ID
粉丝用户ID
colunmnvalue: 关注用户ID
粉丝用户ID
version: 只需要一个版本
c.用户微博内容接收邮件箱表
table name : weibo:receive-content-email
rowkey: 用户ID(粉丝用户ID)
columnfamily: cf
colunmnlabel:
用户ID(发布者ID 被关注用户ID)
colunmnvalue:
取微博内容的rowkey
version: 1000
10001: cf_001_yyyyy
10001: cf_001_xxxxx
hbase 常用命令:
1. disable 'weibo:content': 禁用表
2. drop 'weibo:content': 删除表
3.truncate 'weibo:relations' :清空表数据
- Disabling table...
- Dropping table...
- Creating table...
list_namespace: 查看命名空间
list: 查看表的列表信息
default: 默认使用的命名空间
hbase : 系统默认使用命名空间
drop_namespace 'weibo': 删除指定的命名空间
代码实现
原文链接:https://blog.51cto.com/u_13270164/11214513