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.列族名字的长度影响到发送到客户端的数据长度。所以尽量简洁。
例子:
怎么把这三张关系数据库的表设计为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 | .... |