5.5 HBase表设计
1 HBase表设计特点及需要考虑的问题
- 设计HBase表时需要注意的特点
- HBase中表的索引是通过rowkey实现的
- 在表中是通过Row key的字典顺序来对数据进行排序的, 表中Region的划分通过起始Rowkey和结束Rowkey来决定的
- 所有存储在HBase中的数据都是二进制字节, 没有数据类型
- 原子性只在行内保证, HBase表中没有多行事务
- 列族(Column Family)在表创建之前就要定义好
- 列族中的列标识(Column Qualifier)可以在表创建后动态插入数据的时候添加
- 不同的column family保存在不同的文件中。
- 设计HBase表时需要考虑的问题
- Row key的结构该如何设置, Row key中又该包含什么样的信息
- 表中应该有多少的列族
- 列族中应该存储什么样的数据
- 每个列族中存储多少列数据
- 列的名字分别是什么
- cell中应该存储什么样的信息
- 每个cell中存储多少个版本信息
- DDI 目的是为了克服HBase架构上的缺陷(join繁琐 只有row key索引等)
- Denormalization (反规范化, 解决join麻烦的问题)
- Duplication (数据冗余)
- Intelligent keys(通过row key设计实现 索引 排序对读写优化)
2 HBase表设计案例: 社交应用互粉信息表
-
设计表保存应用中用户互粉的信息
- 读场景:
- 某用户都关注了哪些用户
- 用户A有没有关注用户B
- 谁关注了用户A
- 写场景
- 用户关注了某个用户
- 用户取消关注了某个用户
- 读场景:
-
设计1:
- colunm qulifier(列名) 1: 2:
-
设计2
- 添加了一个 count 记录当前的最后一个记录的列名
-
设计3
- 列名 user_id
-
最终设计(DDI)
- 解决谁关注了用户A问题
- ① 设计一张新表, 里面保存某个用户和他的粉丝
- ② 在同一张表中同时记录粉丝列表的和用户关注的列表, 并通过Rowkey来区分
- 01_userid: 用户关注列表
- 02_userid: 粉丝列表
- 上两种设计方案的问题(事务)
- 解决谁关注了用户A问题
案例总结
- Rowkey是HBase表结构设计中很重要的环节, 直接影响到HBase的效率和性能
- HBase的表结构比传统关系型数据库更灵活, 能存储任何二进制数据,无需考虑数据类型
- 利用列标识(Column Qualifier)来存储数据
- 衡量设计好坏的简单标准 是否会全表查询