一 Hbase是个什么东西?
首先我们来看看两个概念,面向行存储和面向列存储。面向行存储,我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的,面向行存储的数据库主要适合于事务性要求严格场合,或者说面向行存储的存储系统适合OLTP,但是根据CAP理论,传统的RDBMS,为了实现强一致性,通过严格的ACID事务来进行同步,这就造成了系统的可用性和伸缩性方面大大折扣,而目前的很多NoSQL产品,包括Hbase,它们都是一种最终一致性的系统,它们为了高的可用性牺牲了一部分的一致性。好像,我上面说了面向列存储,那么到底什么是面向列存储呢?Hbase,Casandra,Bigtable都属于面向列存储的分布式存储系统。看到这里,如果您不明白Hbase是个啥东西,不要紧,我再总结一下:
Hbase是一个面向列存储的分布式存储系统,它的优点在于可以实现高性能的并发读写操作,同时Hbase还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性。
二 Hbase数据模型
HBase,Cassandra的数据模型非常类似,他们的思想都是来源于Google的Bigtable,因此这三者的数据模型非常类似,唯一不同的就是Cassandra具有Super cloumn family的概念,而Hbase目前我没发现。
在Hbase里面有以下两个主要的概念,Row key,Column Family,我们首先来看看Column family,Column family中文又名“列族”,Column family是在系统启动之前预先定义好的,每一个Column Family都可以根据“限定符”有多个column。
之前说的Row key是啥东西,其实你可以理解row key为RDBMS中的某一个行的主键,但是因为Hbase不支持条件查询以及Order by等查询,因此Row key的设计就要根据你系统的查询需求来设计了。
三 Hbase的优缺点
1 列的可以动态增加,并且列为空就不存储数据,节省存储空间.
2 Hbase自动切分数据,使得数据存储自动具有水平scalability.
3 Hbase可以提供高并发读写操作的支持
Hbase的缺点:
1 不能支持条件查询,只支持按照Row key来查询.
2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.
四.补充
1.数据类型,HBase只有简单的字符类型,所有的类型都是交由用户自己处理,它只保存字符串。而关系数据库有丰富的类型和存储方式。
2.数据操作:HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系,而传统数据库通常有各式各样的函数和连接操作。
3.存储模式:HBase是基于列存储的,每个列族都由几个文件保存,不同的列族的文件时分离的。而传统的关系型数据库是基于表格结构和行模式保存的
4.数据维护,HBase的更新操作不应该叫更新,它实际上是插入了新的数据,而传统数据库是替换修改
5.可伸缩性,Hbase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松增加或减少硬件的数量,并且对错误的兼容性比较高。而传统数据库通常需要增加中间层才能实现类似的功能
Hbase并不是关系数据库,它不支持sql,但在特定的问题空间里,它能够做RDBMS不能做的事情:在廉价硬件构成的集群上管理超大规模的稀疏表。
Hbase是一个分布式的 面向列的数据存储系统,通过在HDFS上提供随机读写来解决Hadoop不能处理的问题,Hbase自底层设计开始即聚焦于各种可伸缩性问题:表可以很“高”(数十亿个数据行);表可以很“宽”(数百万个列);水平分区并在上千个普通商用机节点上自动复制。
严格来说,RDBMS是一个遵循“Codd的12条规则”(Codd’s 12 rules 参考:http://blog.****.net/zelor/article/details/324926)的数据库,标准的RDBMS是模式固定,面向列的数据库且具有ACID性质(原子性 一致性 隔离性 持久性)和复杂的SQL查询处理引擎,RDBMS强调事务的“强一致性”、参照完整性、数据抽象与物理存储层相对独立,以及基于SQL语言的复杂查询支持。在RDBMS中,可以非常容易的建立“二级索引”,执行复杂的内连接和外连接,执行计数、求和、排序、分组等 操作,或对表、行和列中的数据进行分页存放。
Hbase特性:
没有真正的索引 行是顺序存储的,每行中的列也是,所以不存在索引膨胀问题,而且插入性能和表的大小无关。
自动分区 在表增长的时候,表会自动分裂成区域,并分布到可用的节点上。
线性扩展和对新节点的自动处理 增加一个节点,把它指向现有集群并运行regionserver。区域自动重新进行平衡,负载均匀 分布。
普通商用硬件支持
容错 大量节点意味着每个节点的重要性并不突出,不用担心单个节点失效。
批处理 Mapreduce集成功能使我们可以用全并行的分布式作业根据“数据的位置”来处理它们