HBase概念:
HBase是一个分布式面向列的开源数据库,它的思想来源于Google的一篇叫BigTable的论文。与BigTable类似,BigTable是基于GFS(Google File System)的分布式列式数据库,HBase是基于HDFS(Hadoop Distributed File System)的分布式列式数据库,不了解BigTable的读者可能不知道它的内容是什么,这里简单的说明一下:BigTable认为世界上所有的数据库的表结构都可以通过三个列即可实现,行键,列名,列值表示,例如:一个学生表
Student( StudentId , StudentName, StudentClass, StudentAge) Student ( Key, ColumnName, ColumnValue )
( 1234567890, 'StudentName', 'Hirisw' )
( 1234567890 , 'Hirisw', 'InformationSecurity0301' , 23 ) 可以表示成: ( 1234567890, 'StudentClass', 'InformationSecurity0301')
( 1234567890, 'StudentAge', '23' )
这里就只用了3列实现了一个结构性数据库的多列功能,所以BigTable就是一张无所不包的大表。
HBase逻辑模型:
HBase逻辑模型包括:行键,时间戳,列族(包括列可以一个列族包含多个列,列族需要预先定义好不能随意添加,列族里面的列是不需要预先定义的可以根据需求增加),这里拿一个简单的示例来说明HBase的逻辑结构:
HBase原理:
HBase是基于HDFS的,HDFS有一个问题就是文件不能修改,这个原因我们之前的内容已经讲过,那么HBase数据库是怎么实现增删改的呢,这里要讲到的就是所有操作都是基于日志的,都是通过增加记录的形式达到增删改的效果,比如说插入新纪录很好理解就是直接写入一笔数据即可,那如何修改和删除呢,通过新增一个操作内容的记录达到目的,比如说新增一个标记为删除的记录即可达到删除的目的,修改一条记录即可达到修改数据的目的这是在硬盘文件里的做法,如果是在内存里面是可以执行修改内容的动作的,只有当内存达到一定大小的时候再写入文件,那写入文件的删除记录是不是就一直保留在那里呢?其实也不是的,但文件数量增加到一定阈值的时候会将小文件合并成大文件,这个过程中就会把删除的记录去掉。
HBase键值存储:
在整个HBase的存储中是按列族进行存储的,存储格式如下所示,其中键长度和值长度区分当前存储数据键所在范围和值所在范围,行长度和行信息说明属于哪个行,列族长度和列族信息说明属于哪个列族,列信息说明是哪个列,时间戳说明是哪个版本,键类型说明键的类型,后面值信息就是值的内容。
HBase组成部件:
行键:作为数据在HBase里的唯一标识,用来作为检索记录的索引,访问表里行只有三种方式:
1.单行键索引,只通过一个行键进行精确匹配获取数据,这里虽然只有一个行键但是往往不止一条记录而是有多条记录,每一个行键可以带有多个不同的版本时间戳。
2.给定行键范围索引,这里是给出行键的范围如从AAAAA-ZZZZZ就会把这个区间里面的记录都匹配查询获取出来。
3.全表扫描,可以看做是行键的最大值和最小值之间的范围访问,是行键范围索引的一个特例
列族:列的表示形式为<列族>:<限定符>,列族需要建表时实现设定好,但是列不需要事先设定
列族里的列最后都有相同的读写方式(如等长的字符串),以提高性能,比如说读写又或者因为有相同结构能进行高性能压缩,不仅提高存储效率也利于数据在IO中的传输
时间戳:每次数据提交的时间,可由系统自动生成也可以由用户显示赋值。HBase里面保存数据的机制就是跟时间戳有关的,有两种方式
1.根据时间戳由新到旧的次序排序,取一定数量的时间戳进行保留,比如说1000个时间戳,那么从新到旧的时间戳第1000个以后的就会丢弃掉。
2.根据时间戳由新到旧的次序排序,取一定时间内的时间戳进行保留,比如说7天内的时间戳,那么超过7天的时间戳就会被丢弃掉。