HBaes表的设计以及hbase表与RDBMS表的区别

hbase表与RDBMS表的区别:

属性 hbase RDBMS
数据类型 只有字符串 丰富的数据类型
数据查找 简单的增删改查 各种各样的函数与表连接
存储模式 基于列式存储 基于表结构与行式存储
数据保护 更新后可以保留之前版本 保留最新版本
可伸缩性 轻易增加节点,兼容性高 需要中间层,牺牲功能

HBase与 RDBMS 的区别在于: HBase 的 Cell (每条数据记录中的数据项)是具有版本描述的 versioned,行是有序的,列 qualifier )在所属列簇 Column families )存在的情况下,由客户端自由添加。

HBase数据模式

1、表(table):hbase在表中组织数据。表名是字符串和字符的组合,可以在文件系统路径中使用。

2、rowkey:行名,hbase通过rowkey来对数据进行检索,首先系统通过找到某个rowkey所在的region,然后将查询数据的请求发送至该region。因此rowkey的设计很重要,rowkey设计要 遵循散列原则,这样才能避免某个region同时被多个客户访问,而有的region处于空闲状态(这就是热点问题),通常我们可以通过对rowkey进行哈希值处理,取反,rowkey前加随机数来设置rowkey的散列性,避免热点区。

3、列簇:行中的数据通过列族来组织。列族也暗示了数据的物理排列。所以列族必须预先定义,并且不容易被修改。每行都拥有相同的列族,可能有些行的数据为空。列族是字符串和字符的组合,可以在文件系统路径 。并且列簇数量不能多,一般在3个一下。
中使用。

4、时间戳:单元数据是有版本的。版本的区分就是他们的版本号,版本号默认就是时间戳。当写入数据时,如果没有指定时间,那么默认的时间就是系统的当前时间。读取数据的时候,如果没有指定时间,那么返回的就是最新的数据。保留版本的数量根据每个列族的配置。默认的版本数量是3。

在设计表时我们要思考:

  • 1、列簇的个数
  • 2、列簇使用什么数据
  • 3、列名是什么尽管列名不需要在建表时定义,但在读写数据是需要知道
  • 4、单元应该存放什么数据
  • 5、每个列簇多少个时间版本
  • 6、Rowkey 结构是什么,应该包含什么信息

设计表时我们要遵从的原则:

  • 1.行键在表设计中非常重要,决定着应用中的交互以及提取数据的性能。
  • 2.hbase表示非常灵活的,你可以使用字节数组存储任何数据。
  • 3.存错任何数据到列族中,都可以使用相同的访问模式来访问数据。
  • 4.索引仅仅是行键,好好利用,将成为你的优势。
  • 5.深度高的表结构,可以使得你快速且简单的访问数据,但是却丢掉了原子性。宽度广的表结构,可以保证行级别的原子操作,但每行会有很多的列。
  • 6.你需要好好的思考你的表设计,使得可以使用单条API就可以操作,而不是使用多条。hbase不支持跨行的事务,也尽量避免在客户端代码中使用这样的逻辑。
  • 7.行键的哈希可以使得行键有固定的长度和更好的分布。但是却丢弃了使用字符串时的默认排序功能。
  • 8.列标识可以用来存储数据,就像单元数据一样。
  • 9.列标识的长度影响数据存储的足迹。也影响硬盘和网络IO的花销,所以应该尽量简洁。
  • 10.列族名字的长度影响到发送到客户端的数据长度。所以尽量简洁。

例子:

HBaes表的设计以及hbase表与RDBMS表的区别

怎么把这三张关系数据库的表设计为HBase表,并满足需求1和2.

需求1:设计一张表可以查看学生的学号、项目、选修课程编号、课程名称。

1、首先选择rowkey。因为rowkey具有唯一性,所以我们可以选择学生ID为rowkey,并把学生ID进行反转,这样可以避免热点区。

2、选择多少个簇,列名是什么。我们把学生的学号、姓名分为一个簇student,把选修的课程iD课程名分为另一个簇course,列名为课程ID,值为课程名,这样course簇就会有很多列。宽度广的表结构,可以保证行级别的原子操作。

3、 每个列簇多少个时间版本。student簇与rowkey为1对1关系,一个学号不能有多个姓名,所以student簇版本设置为1,。 

course簇设计为列名为课程ID,值为课程名。所以设置course簇版本为1。

最终设计的表结构为:

rowkey student course
studentID studentID studentName 01(课程ID) 02 ....
201601 201601 lisi english math ....