1.HBase概述
1.1 HBase是一个基于HDFS的面向列的分布式数据库,源于Google的BIGTable论文;
1.2 HBase是Apache Hadoop生态系统中的重要组成部分,主要用于海量结构化数据存储;
1.3 HBase内部管理的文件全部存储在HDFS中;
2.NOSQL简介
NoSQL=Not Only SQL,也就是说不仅仅是SQL,会有一些把NOSQL数据的原生查询语句封装成为SQL,比如HBase就拥有Phoenix工具;
常见的NOSQL与RDBMS:
NOSQL:HBase,Redis,MongoDB
RDBMS:MySQL,Oracle,SQL Server,DB2
HBase数据库的特点:
(1)它介于NOSQL与RDBMS之间,仅能通过主键和主键的range来检索数据;
(2)HBase的查询功能简单,不支持JOIN操作;
(3)HBase中支持的数据类型,byte[],底层存储数据的结构都是byte[];
(4)不支持复杂的事务,只支持行级事务(可以通过hive实现多表join的操作);
(5)主要用来存储结构化和半结构化的松散数据;
结构化,半结构化和非结构化:
结构化:数据结构字段含义确定,清晰,典型的如数据库中的表结构;
半结构化:具有一定结构,但语义不够确定,典型的如HTML网页,有些字段是确定的(title),有些不确定(table);
非结构化:杂乱无章的额数据,很难按照一个概念去进行抽取,无规律性;
与hadoop一样,HBase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力;
3.HBase中表的特点
3.1 大,一个表可以有几十亿行,上百万列;
3.2 面向列,面向列族的存储和权限控制,列簇的独立检索;
3.3 稀疏,对于为空的列,并不占据存储空间,因此表可以设计的非常稀疏;
3.4 无模式,每行都有一个可排序的主键和任意多的列,列可以根据需要动态的添加,同一张表不同的行可以使用不同的列;
4.HBase中的名词概念
HBase中的数据表如下:
4.1 Row Key概念
Row Key的概念与mysql中的主键概念是一致的,HBase使用Row Key来唯一的标识一行数据;
由于HBase中仅支持三种查询方式:
(1)基于Row Key的范围扫描;
(2)基于Row Key的单行查询;
(3)全表扫描;
因此Row Key在HBase中的设计至关重要,对HBase的性能影响很大;
Row Key的行键可以说任意字符串(最大长度为64KB),在实际的应用中长度一般为(10-100bytes),最好是16;在HBase的内部,Row Key保存为字节数组,HBas会对表中的数据按照Row Key排序(字典排序);
4.2 Column的概念
列,可理解为mysql中列的概念;
4.3 Column Family的概念
列族,HBase所引入的概念;HBase通过列族划分数据的存储,列族下面可以包含任务多的列,实现数据的灵活存取;就像家族的概念一样,我们知道一个家族搜索由很多家庭构成的;列族也类似,由一个一个的列构成;
HBase表的创建的时候就必须指定列族;就像关系型数据库创建的时候必须指定具体的列一样的;
HBase的列族不是越多越好,官方推荐的是列族最好小于或者等于3,;我们使用的场景一般是1个列族;
4.4 TimeStamp的概念
TimeStamp对于HBase来说至关重要,因为它是实现HBase多版本的关键;在HBase中使用不同的TimeStamp来标识相同的Row Key行对应不同版本的数据;
HBase中通过Row Key和columns确定为一个存储单元成为cell,每个cell都保存着同一份数据的多个版本;版本通过时间戳来索引,时间戳的类型是64位整形,时间戳可以有HBase(在数据写入时自动)赋值,此时间戳是精确到毫秒的当前系统时间;时间戳也可以有客户显示赋值;如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳;每个cell中,不同版本的数据按照倒序排序,即最新的数据排再最前面;
为了避免数据存在过多版本造成的管理(包括存储和索引)负担,HBase提供了两种数据版本回收方式:
保存数据的最后n个版本;
保存最近一段时间内的版本(设置数据的生命周期TTL);
用户可以正对每个列簇进行设置;