HBase(一) 介绍 数据模型
1.介绍
是 Apache Hadoop 的数据库,是建 立在 HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL 的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。
特点:
-
它介于 NoSQL 和 RDBMS 之间,仅能通过主键(rowkey)和主键的 range 来检索数据
-
HBase 查询数据功能很简单,不支持 join 等复杂操作
-
不支持复杂的事务,只支持行级事务(可通过 hive 支持来实现多表 join 等复杂操作)。
-
HBase 中支持的数据类型:byte[](底层所有数据的存储都是字节数组)
-
主要用来存储结构化和半结构化的松散数据。
表的特点:
-
大:一个表可以有上十亿行,上百万列
-
面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
-
稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
-
无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一 张表中不同的行可以有截然不同的列
2.数据模型概念
HBase以表的形式存储数据。表由行和列族组成,列族由若干个列组成。视图如下
数据模型关键概念:
(1)行键(RowKey)
-
rowKey对HBase的性能影响非常大,行键是字节数组,任何字符串都是可以作为行键
-
数据按照RowKey的字节序(byte order)字典顺序来排序存储的
-
所有对表的访问都要通过行键(单个RowKey访问,或者RowKey范围访问,或全表扫描)
(2)列族(ColumnFamily)
-
列族必须在表定义时给出:
-
每个列族可以有一个或多个列,列不需要在表定义时给出,新的列可以随后按需动态加入,一般使用1个列族,官方推荐小于等于3个。
-
数据按列族存储,适合数据分析的情形
(3)列
-
类似数据库的列
(4)时间戳(TimeStamp)
-
时间戳是HBase实现多版本额度关键,在HBase中使用不同的时间戳来标识相同rowKey对应的不同版本的数据。
-
HBase 中通过 rowkey 和 columns 确定的为一个存储单元称为 cell。每个 cell 都保存着同一份 数据的多个版本。版本通过时间戳来索引。
-
每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的存储负担,HBase提供了两种数据版本回收方式:
-
保存数据的最后 n 个版本
-
保存最近一段时间内的版本(设置数据的生命周期 TTL)
(5)单元格(Cell)
-
Cell由行键,列族,限定符,时间戳唯一决定,{rowkey, column( = + ), version}
-
Cell中的数据是没有类型的,全部以字节码形式存储
3.元数据表hbase:meta
HBase中有张存放用户表元数据的表,名为hbase:meta
客户端访问数据的流程:
Client -> Zookeeper -> hbase:meta -> User table
Client访问Zookeeper,查找到hbase:meta表的存放位置,通过hbase:meta获取存放数据的Region信息(找到Region Server),通过Region Server获取查找的数据
-
hbase:meta:记录用户表的Region信息,同时,hbase:meta也可以有多个region
-
ZooKeeper中记录了hbase:meta表的location