非关系型数据库主要有四种数据存储类型:键值对存储(key-value)-----Redis,文档存储(document store)-----MongodDB,基于列的数据库(column-oriented)-----HBase,还有就是图形数据库(graph database)-----Neo4j。每一种都会解决相应的问题,这些问题是关系型数据库所不能解决的。而在实际应用中都会将这几种情况结合起来实现相应的功能。
HBase
列式存储以流的方式在列中存储所有的数据。对于任何记录,索引都可以快速地获取列上的数据;列式存储支持行检索,但这需要从每个列获取匹配的列值,并重新组成行。
HBase(Hadoop Database)是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase是Google BigTable的开源实现,模仿并提供了基于Google文件系统的BigTable数据库的所有功能。HBase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥HBase处理大数据量等功能,需要使用Hadoop作为文件系统。HBase仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务,主要用来存储非结构化和半结构化的松散数据。
Hbase中表的特点:大,稀疏,面向列
HBase在互联网存储的几个应用场景:
1.抓取增量数据
使用HBase 作为数据存储,抓取来自各种数据源的增量数据,如抓取用户交互数据,以备之后进行分析、处理。
2.内容服务
传统数据库最主要的使用场合之一是为用户提供内容服务,如URL短链接服务,可以HBase为基础,存储大量的短链接以及和原始长链接的映射关系。
3.信息交换
Facebook的短信平台每天交换数十亿条短信,HBase可以很好的满足该平台的需求:高的写吞吐量,极大的表,数据中心的强一致性。
Hadoop生态系统中的各层系统
HBase位于结构化存储层;
HDFS为HBase提供了高可靠性的底层存储支持;
MapReduce为HBase提供了高性能的计算能力;
Zookeeper为HBase提供了稳定服务和失败恢复机制;
Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单;
Sqoop则为HBase提供了方便的RDBMS数据导入功能,方便数据迁移;
HBase的三个主要的功能组件
- 库函数:链接到每个客户端;
- 一个HMaster主服务器;
- 许多个HRegion服务器。
HBase三层结构
1.Zookeeper文件:它记录了-ROOT-表的位置信息,即root region的位置信息。
2.-ROOT-表:只包含一个root region,记录了.META.表中的region信息。通过root region,我们就可以访问.META.表的数据。
3.META.表:记录了用户表的HRegion信息,.META.表可以有多个HRegion,保存了HBase中所有数据表的HRegion位置信息。
HBase两种文件类型
- HFile:HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上HStoreFile就是对HFile做了轻量级包装,即HStoreFile底层就是HFile。
- HLogFile:HBase中WAL(Write Ahead Log)的存储格式,物理上是Hadoop的顺序文件。
Hbase与传统关系型数据库区别:
数据类型
HBase只有简单的字符串类型,所有类型都由用户自己处理,它只保存字符串;
关系数据库有丰富的类型选择和存储方式。
数据操作
HBase操作只有很简单的插入、查询、删除、清空等,表和表之间是分离的,没有复杂的表和表之间的关系,所以也不能也没有必要实现表和表之间的关联等操作;
传统的关系数据通常有各种各样的函数、连接操作。
存储模式
HBase是基于列存储的,每个列族都有几个文件保存,不同列族的文件是分离的;
传统的关系数据库是基于表格结构和行模式保存的。
数据维护
HBase的更新正确来说应该不叫更新,而且一个主键或者列对应的新的版本,而它旧有的版本仍然会保留,所以它实际上是插入了新的数据;
传统关系数据库里面是替换修改。
可伸缩性
HBase和BigTable这类分布式数据库就是直接为了这个目的开发出来的,能够轻易的增加或者减少(在硬件错误的时候)硬件数量,而且对错误的兼容性比较高;
传统的关系数据库通常需要增加中间层才能实现类似的功能。
修改表模式需要先将表设置为不可用(disable),模式修改完成再启用表(enable)