(一)Hbase的来源
2006年Google技术人员Fay Chang发布了一篇文章Bigtable: ADistributed Storage System for Structured Data。该文章向世人介绍了一种分布式的数据库,这种数据库可以在局部几台服务器崩溃的情况下继续提供高性能的服务。
2007年Powerset公司的工作人员基于此文研发了BigTable的Java开源版本,即HBase。刚开始它只是Hadoop的一部分。
2008年HBase成为了Apache的顶级项目。HBase几乎实现了BigTable的所有特性。它被称为一个开源的非关系型分布式数据库。
2010年HBase的开发速度打破了一直以来跟Hadoop版本一致的惯例,因为HBase的版本发布速度已经超越了Hadoop。它的版本号一下从0.20.x跳跃到了0.89.x。其Logo也进行了更换!
(二)HBase 之CAP
HBase在CAP中是CA,HBase作为数据库做到一致性和数据的高可用性,不能因为数据量大了之后HBase就崩溃了,
至于分区容错性问题,HBase侧重点是CA,但是HBase也提供了分区容错性,因为HBase非常的聪明,它没有自己设计数据的存储,而是借助了HDFS,HDFS在存储的时候是有副本的概念的,副本你就可以考虑是分区容错性,如果一个机器坏掉了, 还可以从别的机器上的副本恢复数据过来.
(三)HBase定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。
基于HDFS存储.
Hbase面向列存储,构建于Hadoop之上,类似于Google的BigTable,提供对10亿级别表数据的快速随机实时读写!
(四)HBase支持随机写
HBase的读写操作还是借助HDFS完成,要完成随机写,根本上还是需要复合HDFS的特性!
HDFS只支持追加写!
随机的操作: Update+Delete 借助 追加写+时间戳(版本号)
只允许客户端查询时返回时间戳最新的数据!
HBase 是key value 的结构, 然后还有一个时间,当你update的时候,假如说有 k1和v1 ,其实还有隐藏的时间戳版本号,当你update的时候比如说给k1修改成v2,其实是新加了一条数据 k1和v2,已经隐藏的时间戳版本号,
当你查询k1的时候, 只会显示时间戳版本号最新的那条.时间戳版本号旧的那条记录不会显示,这样程序员就误以为随机写操作了,其实还是顺序写操作.
当你删除k1的时候,HBase会给k1这条数据添加value为空字符串,以及新的时间戳版本号,添加个删除标记,在你查询k1的时候查询出时间戳是最新的那条记录,然后发现有删除标记,此时不展示给程序员,就查询不出来了.程序员就误以为删除了.
以上操作其实是在HDFS里面写了key为 k1的三条数据.查询的时候只会查询时间戳最新的那一条K1记录.
过一段时间之后,HBase会对数据进行重写操作,重写之后发现k1最新的数据已经有删除标识了,此时HBase重写完了之后k1就什么都没有了.
(五)Hbase的特点
1.HBase支持海量数据的实时读写
①分布式(多个服务端可以同时处理请求)
②索引,LSM树(B+书的更高级的实现.方便更快速的检索数据)
③key value 查找快
④吃内存 部分的数据直接放内存里面
⑤列式存储(大数据基本都是列式存储)
⑥布隆过滤器(查询一条记录的时候可以快速的帮你确定要么可能存在,要么一定不存在,这样就可以减少很多查询的请求)
2.HBase的特点
1)海量存储
HBase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与HBase的极易扩展性息息相关。正式因为HBase良好的扩展性,才为海量数据的存储提供了便利。
HBase可以保存海量数据的大表,比如说有10亿级别的行,百万级别的列的大表. 然后这个大的表里面再存一些海量的数据.
如果数据量特别小,只有几十万行,那么用Mysql就足够了. 所以一般中小公司是用不到HBase的
2)列式存储
这里的列式存储其实说的是列族存储,HBase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
列族就是多个列的家族,你在这个列族下面你可以随意定义很多列,你在建表的时候你只需要指定列族就行了.
3)极易扩展
存储能力扩容
HBase是基于HDFS的, 扩容只需要扩展HDFS即可. 就是加机器,让机器加DataNode就行了.
服务能力扩容
HBase服务端是接收你客户端读写请求的,如果你一个服务端接收10万个客户端请求的话,那么压力是很大的,
你也可以同时扩容多个服务端,在HBase的时候有个RegionSever的节点,这个RegionSever节点就是接收HBase的读写请求的.这个东西就类似于HDFS的NameNode.
在高并发的访问环境下,你可以多添加一些RegionSever ,会提升Hbsae服务能力.
4)高并发
由于目前大部分使用HBase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,HBase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。
5)稀疏
稀疏主要是针对HBase列的灵活性,HBase是基于列族,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
在传统的关系型数据库,你需要定义一个表有多少个列,而在HBase你只需要定义有几个列族即可.在列族下面你再定义一些列,比如说列族A下面有 a列 b列 , 列族B下面有c列d列.
在MySQL中,如果你列没有数据的话会给存一个Null ,在hive没数据的话是给你存 “\n”, 在HBase的话如果你有的列没有数据的话什么都不存,更节省空间.
3.Hbase的优点
1.HDFS有高容错,高扩展的特点(HDFS有多个副本的概念,HBase可以启动多个RegionSever,多个RegionSever 可以同时接收客户端请求,假如RegionSever 1挂掉了,HBase会自动把请求路由到RegionSever2上. ),相当于自动HA操作.而Hbase基于HDFS实现数据的存储,因此Hbase拥有与生俱来的超强的扩展性和吞吐量
2.HBase采用的是Key/Value的存储方式,这意味着,即便面临海量数据的增长,也几乎不会导致查询性能下降.Key还可以进行排序,如果想查找一个Key,那么可以用二分查找法快速的找到对应的Key.然后再根据Key获取Value.
3.HBase是一个列式数据库,相对于于传统的行式数据库而言。当你的单张表字段很多的时候,可以将相同的列(以regin为单位)存在到不同的服务实例上,存到哪台服务器上,那台服务器的RegionSever就处理这个服务器的数据读写请求,分散负载压力。
假如说有一张表,你在客户端看到的以为是一张表,但是实际上表里面的数据都是存到文件里面的, 只不过你在查询的时候我用逻辑表的视图给你显示而已.假如表里面有若干列,那么我可以通过多个客户端去查询,多个客户端对应多个RegionServer,第一个RegionServer查询前10列的数据,然后第二个RegionServer查询后10列的数据.
4.Hbase的缺点
1.架构设计复杂,且使用HDFS作为分布式存储,因此只是存储少量数据,它也不会很快。在大数据量时,它慢的不会很明显!
2.Hbase不支持表的关联操作,因此数据分析是HBase的弱项。常见的 group by或order by只能通过编写MapReduce来实现(因为HBase的数据存在HDFS上面)
3.Hbase部分支持了ACID
5.Hbase的总结
适合场景:单表超千万,上亿,且高并发!
不适合场景:主要需求是数据分析,比如做报表。数据量规模不大,对实时性要求高!