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. Keras(五)LSTM 长短期记忆模型 原理及实例

    LSTM 是 long-short term memory 的简称, 中文叫做 长短期记忆. 是当下最流行的 RNN 形式之一 RNN 的弊端 RNN没有长久的记忆,比如一个句子太长时开头部分可能会忘 ...

  2. Python 基础(二)

    输入一个字符串,以列表输出大写,如果包含整数,转为整型 str = input() list = [] for i in str: if i.isdecimal() == True: list.app ...

  3. tesseract-ocr下载

    参考:http://www.tuicool.com/articles/E3MNziM 1.下载地址:https://sourceforge.net/projects/tesseract-ocr/fil ...

  4. 2019杭电多校6 hdu6638 Snowy Smile(二维最大矩阵和 线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你一些点的权值,让找一个矩形圈住一部分点,问圈住点的最大权值和 分析:由于是稀疏图,明显要先把x, ...

  5. HDU2874 Connections between cities 最近公共祖先

    第一次按常规的方法求,将所有的查询的u,v,和最近公共祖先都保存起来,然后用tarjan+并查集求最近公共祖先.因为询问的次数过多,所以在保存查询的时候总是MLE,后来参考了一下别人的代码,才突然觉悟 ...

  6. POJ-2104 K-th Number CDQ分治

    题目传送门 题意:给你一个序列,长度为n,m次询问,询问一段区间的第k大. 题解:CDQ分治,对整个值域进行分治.每次取一个mid, 计算出整个区间内mid <= 的数目,如果 num > ...

  7. poj 2649 Factovisors 对n!进行因数分解

    Factovisors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4431   Accepted: 1086 Descr ...

  8. SpringAop应用

    1. 引言 为什么要使用Aop?贴一下较为官方的术语: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方 式和运行期动态代理实现程序功能 ...

  9. Day002_LInux基础_常用命令

    #空格和tab键↓↓mkdir 创建目录 ↓ls list 显示目录里面的内容详情↓cd change directory 切换目录,进入到目录↓pwd 显示当前所在路径 ,定位↓###绝对路径和相对 ...

  10. PathMarker:命令行快速编辑跳转工具(配合git,find等)

    简介 当使用git, find等工具时,一般需要进一步打开文件或跳转目录. 通常的做法是使用鼠标复制黏贴,或者手工输入. PathMarker提供一种快速通过标号,编辑相关文件,跳转相关目录的方法,提 ...