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的更多相关文章

  1. HBase(九)HBase表以及Rowkey的设计

    一 命名空间 1 命名空间的结构 1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定, 则在 default 默认的命名空间中. 2) RegionServer g ...

  2. 七 HBase表结构设计

      表结构设计之  高表  与 宽表 选择       HBase 中的表可以设计为高表(tall-narrow table) 和 宽表(flat-wide table).         高表 : ...

  3. 无废话ExtJs 入门教程四[表单:FormPanel]

    无废话ExtJs 入门教程四[表单:FormPanel] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在窗体里加了个表单.如下所示代码区的第28行位置,items:form. ...

  4. HBase 入门笔记-数据落地篇

    一.前言 关于数据落地方面,HBase官网也有相关介绍.本文主要介绍一下实际工作中涉及的数据存储方面的一些经验和技巧,主要涉及表rowkey设计.数据落地方案 二.表设计 相对于MySQL等关系型数据 ...

  5. HBase(四)HBase集群Shell操作

    一.进入HBase命令行 在你安装的随意台服务器节点上,执行命令:hbase shell,会进入到你的 hbase shell 客 户端 [admin@node21 ~]$ hbase shell S ...

  6. 一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...

  7. 1.1-1.3 HBase入门

    一.HBASE入门 部分参考链接:https://www.cnblogs.com/steven-note/p/7209398.html 1.简介 HBase – Hadoop Database,是一个 ...

  8. 一条数据的HBase之旅,简明HBase入门教程-开篇

    常见的HBase新手问题: 什么样的数据适合用HBase来存储? 既然HBase也是一个数据库,能否用它将现有系统中昂贵的Oracle替换掉? 存放于HBase中的数据记录,为何不直接存放于HDFS之 ...

  9. Hbase入门(三)——数据模型

    Hbase最核心但也是最难理解的就是数据模型,由于与传统的关系型数据库不同,虽然Hbase也有表(Table),也有行(Row)和列(Column),但是与关系型数据库不同的是Hbase有一个列族(C ...

随机推荐

  1. MySQL之PXC集群搭建

    一.PXC 介绍 1.1 PXC 简介 PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实 ...

  2. hdu 2615 Division(暴力)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2615 题解:挺简单的暴力枚举,小小的分治主要是看没人写题解就稍微写一下 #include <io ...

  3. 牛客小白月赛 G 异或 找规律

    链接:https://www.nowcoder.com/acm/contest/135/G来源:牛客网 题目描述 从前,Apojacsleam家的水族箱里,养了一群热带鱼. 在这几条热带鱼里,Apoj ...

  4. dp递推 数字三角形,dp初学者概念总结

    数字三角形(POJ1163)          在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出 ...

  5. Codeforces Round #582 (Div. 3)

    题目链接:https://codeforces.com/contest/1213 A: 题意:给定数的位置,位置为整数,每个数可以向左或右移动一格或者两格,移动一格花费一个硬币,两格不花费硬币,问所有 ...

  6. Postgresql-rman

    联机程序. 并且目标数据库必须处于归档模式. 支持在线全备, 增量备份, 归档备份 增量备份基于已经存在的一个全库备份 rman 本身使用pg_start_backup(), copy, pg_sto ...

  7. 明明有class为什么还是报ClassNotFoundException?

    描述 我们修改接口时,习惯发布一个快照版本用于测试.我们的一个服务也是发布了快照版本,然后一个jar程序要依赖这个服务,修改pom文件打包部署后,通过 java -jar 命令执行这个jar程序,然后 ...

  8. android中shape 的使用

    android 开发中 对于 shape 和 selector的使用,一直都不是很熟练, 记录一下.便于以后参考. 举个项目中例子图 对于上面的2个radiobutton ,背景我们可以让美工做一个. ...

  9. JAVA集合框架包含的内容

    Java集合框架提供了一套性能优良.使用方便的接口和类,他们位于java.util包中. Collection接口 主要有List.Set等实现类,Map接口主要有HashMap.TreeMap等实现 ...

  10. springmvc 事务控制与数据库隔离级别

    springmvc 事物传播与数据库隔离控制 http://www.cnblogs.com/yangy608/archive/2011/06/29/2093478.html 一.Propagation ...