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

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

创建
Hbase就是通过 表 Rowkey 列族 timestamp确定一行数据。
这与关系型数据库完全不同:
| 属性 | HBase | RDBMS |
|---|---|---|
| 数据类型 | 只有字符串 | 丰富的数据类型 |
| 数据操作 | 简单的增删改查 不支持join | 各种函数和表连接 |
| 存储模式 | 基于列式存储 | 基于表格结构和行式存储 |
| 数据保护 | 更新后仍然保留旧版本 | 替换 |
| 可伸缩性 | 轻易的增加节点,兼容性高 | 需要中间层,牺牲功能 |
所以Hbase需要考虑的因素有:
1、这个表应该有多少列族
2、列族使用什么数据
3、每个列族有多少列
4、列名是什么
5、单元应该存放什么数据
6、每个单元存储多少时间版本
7、Rowkey结构是什么,应该包含什么信息
需要注意的点:
1、Join
Hbase中没有join 所以需要大表结构 行记录加关键字 解决这个问题
2、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就只能扫描全表,那么性能将会大幅度下降。
这里用影片热度排行榜举例:
1、Rowkey是以字典序从大到小
原生Hbase只支持从小到大排序,要想实现从大到小,可以采用 Rowkey=Integer.MAX_VALUE-Rowkey的方式,在应用层再转回来完成需求。
2、Rowkey尽量散列
Rowkey要尽量散列,这样可以保证数据不在一个Region上,从而避免了读写的集中。
比如我们可以设计 userid_videoid 拼接字符串 这样的话user就会不均匀。
有三种办法解决: 反转userid 散列userid 将userid取模后进行MD5加密 取前6位加入userid中
3、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表结构设计:
店铺表:

商品表:

微博用户与粉丝
用户与粉丝是一对多
RDBMS表结构设计:
用户表:
| 列名 | 列含义 |
|---|---|
| id | 主键 |
| nickname | 用户名 |
粉丝对应表:
| 列名 | 列含义 |
|---|---|
| user_id | 用户id |
| fans_id | 粉丝id |
Hbase表结构设计:

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

Hbase入门(四)——表结构设计-RowKey的更多相关文章
- HBase(九)HBase表以及Rowkey的设计
一 命名空间 1 命名空间的结构 1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定, 则在 default 默认的命名空间中. 2) RegionServer g ...
- 七 HBase表结构设计
表结构设计之 高表 与 宽表 选择 HBase 中的表可以设计为高表(tall-narrow table) 和 宽表(flat-wide table). 高表 : ...
- 无废话ExtJs 入门教程四[表单:FormPanel]
无废话ExtJs 入门教程四[表单:FormPanel] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在窗体里加了个表单.如下所示代码区的第28行位置,items:form. ...
- HBase 入门笔记-数据落地篇
一.前言 关于数据落地方面,HBase官网也有相关介绍.本文主要介绍一下实际工作中涉及的数据存储方面的一些经验和技巧,主要涉及表rowkey设计.数据落地方案 二.表设计 相对于MySQL等关系型数据 ...
- HBase(四)HBase集群Shell操作
一.进入HBase命令行 在你安装的随意台服务器节点上,执行命令:hbase shell,会进入到你的 hbase shell 客 户端 [admin@node21 ~]$ hbase shell S ...
- 一条数据的HBase之旅,简明HBase入门教程-Write全流程
如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...
- 1.1-1.3 HBase入门
一.HBASE入门 部分参考链接:https://www.cnblogs.com/steven-note/p/7209398.html 1.简介 HBase – Hadoop Database,是一个 ...
- 一条数据的HBase之旅,简明HBase入门教程-开篇
常见的HBase新手问题: 什么样的数据适合用HBase来存储? 既然HBase也是一个数据库,能否用它将现有系统中昂贵的Oracle替换掉? 存放于HBase中的数据记录,为何不直接存放于HDFS之 ...
- Hbase入门(三)——数据模型
Hbase最核心但也是最难理解的就是数据模型,由于与传统的关系型数据库不同,虽然Hbase也有表(Table),也有行(Row)和列(Column),但是与关系型数据库不同的是Hbase有一个列族(C ...
随机推荐
- Python数据类型详解——元组
Python数据类型详解--元组 有时候我们的列表数据不想被别人修改时该怎么办? 此时,就可以使用元组来存放,元祖又称为只读列表,不能修改 定义方式:与列表类似,将列表的[]换成()即可. 特性: 1 ...
- HAOI2006 (洛谷P2341)受欢迎的牛 题解
HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...
- .NET敏感信息分离托管 娓娓道来
引言 互联网每隔一段时间就会爆出 [某程序猿在代码托管平台上传了公司机密配置信息,导致公司核心数据被黑客获取或修改], 一茬又一茬背锅侠层出不穷. 软件工程理论早以加粗字体给出 经典原则:Never ...
- 通知&代理
通知:多对多的关系,比较耗性能 使用: 1.观察者到通知中心注册(接受那个发布者发布的什么通知,监听到通知后的处理方法) [[NSNotificationCenter defaultCenter] ...
- codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)
题目链接:http://codeforces.com/contest/713/problem/C 题解:这题也算是挺经典的题目了,这里附上3种解法优化程度层层递进,还有这里a[i]-i<=a[i ...
- Fractions Again?! UVA - 10976
It is easy to see that for every fraction in the form 1k(k > 0), we can always find two positive ...
- 封装返回给前台的json
JsonResult类的定义: /*生成Json串*/ public class JsonResult { /** * 返回错误状态的json串 * * @param status 错误代码,非零数值 ...
- 如何在 Ubuntu 上安装 MongoDB
MongoDB 是一个越来越流行的自由开源的 NoSQL 数据库,它将数据存储在类似 JSON 的灵活文档集中,这与 SQL 数据库中常见的表格形式形成对比. 你很可能发现在现代 Web 应用中使用 ...
- vsnprint参数和意义
_vsnprintf(char *str, size_t size, const char *format, va_list ap) char *str [out],把生成的格式化的字符串存放在这里. ...
- Django之FBV和CBV的用法
FBV FBV,即 func base views,函数视图,在视图里使用函数处理请求. 以用户注册代码为例, 使用两个函数完成注册 初级注册代码 def register(request): &qu ...