Hbase的表结构设计与关系型数据库有不少不一样,主要是Hbase有Rowkey和列族、timestamp这几个全新的概念,如何设计表结构就很是的重要。数据库
Hbase就是经过 表 Rowkey 列族 timestamp肯定一行数据。数组
这与关系型数据库彻底不一样:ide
属性 |
HBase |
RDBMS |
---|---|---|
数据类型 | 只有字符串 |
丰富的数据类型 |
数据操做 | 简单的增删改查 不支持join | 各类函数和表链接 |
存储模式 | 基于列式存储 |
基于表格结构和行式存储 |
数据保护 | 更新后仍然保留旧版本 |
替换 |
可伸缩性 | 轻易的增长节点,兼容性高 |
须要中间层,牺牲功能 |
因此Hbase须要考虑的因素有:函数
一、这个表应该有多少列族性能
二、列族使用什么数据编码
三、每一个列族有多少列加密
四、列名是什么spa
五、单元应该存放什么数据设计
六、每一个单元存储多少时间版本3d
七、Rowkey结构是什么,应该包含什么信息
须要注意的点:
一、Join
Hbase中没有join 因此须要大表结构 行记录加关键字 解决这个问题
二、Rowkey
Rowkey设计很是重要 因为Hbase是有序的 须要考虑前缀后缀问题
能够经过Hbase Shell和 Java Api建立:
Configuration config = HBaseConfiguration.create();
Admin admin = new Admin(conf);
TableName table = TableName.valueOf("myTable");
admin.disableTable(table);
HColumnDescriptor cf1 = ...;
admin.addColumn(table, cf1); // adding new ColumnFamily
HColumnDescriptor cf2 = ...;
admin.modifyColumn(table, cf2); // modifying existing ColumnFamily
admin.enableTable(table);复制代码
Rowkey是不可分割的字节数组,按字典序存储在表中。
因为:Region基于Rowkey为一个区间的行提供服务 HFile在硬盘上存储有序的行 因此Rowkey就极大的影响了Hbase的性能。
Rowkey就是索引,若是不清楚Rowkey就只能扫描全表,那么性能将会大幅度降低。
这里用影片热度排行榜举例:
一、Rowkey是以字典序从大到小
原生Hbase只支持从小到大排序,要想实现从大到小,能够采用 Rowkey=Integer.MAX_VALUE-Rowkey的方式,在应用层再转回来完成需求。
二、Rowkey尽可能散列
Rowkey要尽可能散列,这样能够保证数据不在一个Region上,从而避免了读写的集中。
好比咱们能够设计 userid_videoid 拼接字符串 这样的话user就会不均匀。
有三种办法解决: 反转userid 散列userid 将userid取模后进行MD5加密 取前6位加入userid中
三、Rowkey长度要尽可能短
Rowkey过长,存储开销会大。
Rowkey过长,会致使内存的利用率下降,进而下降索引命中率。
列族是一些列的集合,一个列族全部成员都有一样的前缀,好比courses:history 和 courses:math都是courses列族的成员。冒号是分隔符。列族前缀必须是可输出字符,列可由任意字节数组组成。
列族必须在表创建的时候声明,列则不须要特别声明,用户随时能够建立新列。
经验法则:
店铺shop 商品 item 是多对多的关系
商铺表:
列名 |
列含义 |
---|---|
id |
主键 |
name |
店铺名称 |
address | 所在地 |
regdate | 注册日期 |
商品表:
列名 |
列含义 |
---|---|
id |
主键 |
name |
商品名称 |
price |
价格 |
details | 商品详情 |
title |
展现名称 |
关系表:
列名 |
列含义 |
---|---|
shop_id | 店铺主键 |
item_id | 商品主键 |
type |
关联类型 |
店铺表:
商品表:
用户与粉丝是一对多
用户表:
列名 |
列含义 |
---|---|
id |
主键 |
nickname | 用户名 |
粉丝对应表:
列名 |
列含义 |
---|---|
user_id | 用户id |
fans_id | 粉丝id |
更多实时计算,Hbase,Flink,Kafka等相关技术博文,欢迎关注实时流式计算