Hbase入门(四)——表结构设计-RowKey

file

Hbase的表结构设计与关系型数据库有不少不一样,主要是Hbase有Rowkey和列族、timestamp这几个全新的概念,如何设计表结构就很是的重要。数据库

file

建立

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设计

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列族的成员。冒号是分隔符。列族前缀必须是可输出字符,列可由任意字节数组组成。

列族必须在表创建的时候声明,列则不须要特别声明,用户随时能够建立新列。

经验法则:

  • 目标是把 region 的大小限制在 10 到 50 GB 之间。
  • 目标是限制 cell 的大小在 10 MB 以内,若是使用的是 mob类型,限制在 50 MB 以内。不然,考虑把 cell 的数据存储在 HDFS 中,并在 HBase 中存储指向该数据的指针。
  • 典型的 scheme 每张表包含 1 到 3 个列族。HBase 表设计不该当和 RDBMS 表设计相似。
  • 对于拥有 1 或 2 个列族的表来讲,50-100 个 region 是比较合适的。请记住, region 是列族的连续段。
  • 保持列族名称尽量短。每一个值都会存储列族的名称(忽略前缀编码)。它们不该该像典型 RDBMS 那样,是自文档化,描述性的名称。
  • 若是你正在存储基于时间的机器数据或者日志信息,而且 row key 是基于设备 ID 或者服务 ID + 时间,最终会出现这样一种状况,即更旧的数据 region 永远不会有额外写入。在这种状况下,最终会存在少许的活动 region 和大量不会再有新写入的 region。对于这种状况,能够接受更多的 region 数量,由于资源的消耗只取决于活动 region。
  • 若是只有一个列族会频繁写,那么只让这个列族占用内存。当分配资源的时候注意写入模式。

实例

店铺与商品

店铺shop 商品 item 是多对多的关系

RDBMS表结构设计:

商铺表:

列名
列含义
id
主键
name
店铺名称
address 所在地
regdate 注册日期

商品表:

列名
列含义
id
主键
name
商品名称
price
价格
details 商品详情
title
展现名称

关系表:

列名
列含义
shop_id 店铺主键
item_id 商品主键
type
关联类型

Hbase表结构设计:

店铺表:

file

商品表:file

微博用户与粉丝

用户与粉丝是一对多

RDBMS表结构设计:

用户表:

列名
列含义
id
主键
nickname 用户名

粉丝对应表:

列名
列含义
user_id 用户id
fans_id 粉丝id

Hbase表结构设计:

file

更多实时计算,Hbase,Flink,Kafka等相关技术博文,欢迎关注实时流式计算

file

相关文章
相关标签/搜索