HBASE表结构、优缺点及设计思想
HBASE来源
HBASE由 DOUG CUTTING开发,最终来自于google。最初是Google面临 海量网页数据 提出的解决方案。来源于google的一篇论文: bigdata。可以参考这篇文章:Hbase的产生背景
hbase的设计思想
hbase是随机快速查询的。(随机(近)实时查询的)
hbase 是分布式nosql数据库,数据量很大的数据库。
原理:构建索引。
跳表结构 ,创建多层索引的, 布隆过滤器
hbase 默认创建二层索引, 最上层的索引 ,无论多大都不会切分的。
hbase对zk的依赖性极强
1)选主
2)寻址机制
最上层索引表的存储hbase节点位置
查询时:zk--->最上层索引表--->hbase节点--->需要的数据。
HBASE特点
hbase可以实现 海量数据 的快速随机查询。是一个分布式数据库。
hbase表的特点:
- 表大 :
一个表可以有上十亿行,上百万列。 - 面向列:
hbase是面向列的,严格说是面向列族的,一个列族存储在一个物理文件中。 - 稀疏
hbase的底层数据存储:所有的数据存储的都是字节(byte[ ])。
稀疏存储:每一行只存储自己有的列,null值不参与存储。 - 无模式
hbase是无严格模式的。 (表结构决定的)
有严格模式,分为读模式和写模式
读模式:数据读取的时候,进行数据校验。 eg:hive 中 load 时
写模式: 数据写入的时候,进行数据校验。 eg:mysql 存数据时
hbase数据库的特点:
-
1)不能支持join
-
2)所有的数据 ,底层存储的时候,以 byte[] 进行存储
1、HBASE是面向列的。
hive : 传统关系型数据库,是面向行的方式的。(一行数据,一定是存在一个文件中的)
hbase的存储数据, 以列为切分方向的。
面向行:一行数据,在存储的时候,是不会被拆分的,一行数据,是物理文件存储的最小的单元了。
面向列:以列为单位进行存储的。表中的一列,会存储在一个物理文件中。
实际是hbase不是完全面向列的,是面向列族的。
面向列的优势:
1)便于压缩
2)便于查询,提升查询效率
2、HBASE是nosql数据库
- 1)nosql:
1、非关系型数据库
2、不支持标准sql,hbase中提供全新的shell - 2)not only sql
1、不仅仅是sql
2、通过第三方工具,可以实现支持标准sql(例如phoenix)
注意:
hbase表中的数据也是存储在hdfs上的。 表中的数据会被HBASE加工成hbase能够识别的结构,进行存储。 HBASE查询的时候,也是执行计算引擎 mr。
hbase的表结构
传统关系型数据库,是二维表。
传统关系型数据库的表结构: 表名–字段–类型–分区–分桶等
hbase是四维表,eg:
- 1)行键 row key,是一行的唯一标识 (表数据的一部分)
相同行键的数据,认为是同一行的数据。不同行的数据,行键一定不同。
因此行键具有唯一性。
hbase中表,创建索引的时候,按照行健进行索引。hbase中的行健默认会按照字典顺序进行升序排序,便于创建索引。 - 2)列族(列簇): column family。列族是表结构的一部分(schema)
列簇:一个或多个列。(一个列族会存储一个物理文件)
每一个列,都是属于某一个列族的。列不是独立存在的,而是依附列族的。
每一个列族下有多个列,每一行同一个列族下的列都是不一样的。
-
生产经验:
实际生产环境中,一般每一个表列族个数不要超过3个。 -
一般而言:
- 1、同一个列族下,存储的列具有相同的IO属性的列数据。
- 2、hbase是面向列族存储的。一个列族对应一个物理文件。
- 3、相同的IO属性:经常在一起,进行读写访问的列。
相同IO属性是由业务决定的,例如name,age,sex等查询时会放在一起同时查询,目的是为了方便查询。 - 4、业务是经常变化的,所以一般是少设计一些列族,将尽量多的字段放在同一个列族下,生产上一般是一个或2个列族。
-
3)列 column
列属于表数据的一部分。
在插入数据的时候,根据数据指定列名(列值)。
每一个列都会有属于指定的列族。
要想定位一个列,首先要指定一个列族。info01:address 和 info02:address 不是一列。 -
4)数据版本(时间戳):version
version是每一个单元格的一个标识。通常情况下,用系统时间戳进行标识。(也可以手动指定时间戳)。
每一个列存储的数据,是可以存储多个版本的。
存储每一个列数据的时候,默认添加一个时间戳信息, 这个时间戳信息就是数据版本。
默认每一列只存储一个版本的,即最新版本。 -
5)单元格 cell
每一个列的一个值,对应一个单元格。
每一列的每一个值(带时间戳)存储在一个单元格中的。
HBASE定位一个单元格的方式:表名–>行键–>列簇–>列–>时间戳
hbase的优缺点
① 它介于 NoSQL 和 RDBMS 之间,仅能通过主键(rowkey)和主键的 range 来检索数据
② HBase 查询数据功能很简单,不支持 join 等复杂操作
③ 不支持复杂的事务,只支持行级事务(可通过 hive 支持来实现多表 join 等复杂操作)。
④ HBase 中支持的数据类型:byte[](底层所有数据的存储都是字节数组)
⑤ 主要用来存储结构化和半结构化的松散数据。