hbase实战——(1.1 nosql介绍)
什么是nosql
NoSQL(NoSQL = Not Only SQL),意思是不仅仅是SQL的扩展,一般指的是非关系型的数据库。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,传统的电信行业动辍就千万甚至上亿的数据,甚至有客户提出需要存储相关的日志数据50年以上,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
关系型数据库难以克服的问题:
- 不能很好处理对数据库高并发读写的需求
- 不能很好处理对海量数据的高效率存储和访问的需求
- 不能很好处理对数据库的高可扩展性和高可用性的需求
为什么使用nosql
SQL语言和关系型数据库(MySQL、PostgreSQL、Oracle等)是通用的数据解决方案,占有绝大多数的市场。但是就像上面提到的,它有很多难以解决的问题。不过在最近兴起的NoSQL运动中,涌现出一批具备高可用性、支持线性扩展、支持Map/Reduce操作等特性的数据产品,它们具有如下特性:
- 频繁的写入操作、相对较少的读取统计信息的操作
- 海量数据(如数据仓库中需要分析的数据)适合存储在一个结构松散、分布式的文件存储系统中
- 存储二进制文件(如mp3或者pdf文档)并且能够直接为用户的浏览器提供下载功能
使用这些数据产品并不是要取代原有的数据产品,而是为不同的应用场景提供更多的选择。也就是说,在一些特定的情况下如果是关系型的数据库解决不了的问题,那么就可以考虑使用nosql,而不是说完全将应用移植到nosql上,毕竟适合才是最好的。
现在流行的nosql
下面对现在的nosql进行了整理,其中包括各种nosql的官方网站。
HBase是什么
HBase是Apache Hadoop中的一个子项目,Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用hadoop的DFS工具就可以看到这些这些数据 存储文件夹的结构,还可以通过Map/Reduce的框架(算法)对HBase进行操作,如下图所示:
HBase在产品中还包含了Jetty,在HBase启动时采用嵌入式的方式来启动Jetty,因此可以通过web界面对HBase进行管理和查看当前运行的一些状态,非常轻巧方便。
HBase是Apache Hadoop中的一个子项目,现已成为Apache的顶级项目。
HBase是Google Bigtable(基于Google File System)的开源山寨版本。
为什么采用HBase
HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.所谓非结构化数据存储就是说HBase是基于列的而不是基于行的模式,这样方便读写你的大数据内容。
HBase是介于Map Entry(key & value)和DB Row之间的一种数据存储方式。就点有点类似于现在流行的Memcache,但不仅仅是简单的一个key对应一个 value,你很可能需要存储多个属性的数据结构,但没有传统数据库表中那么多的关联关系,这就是所谓的松散数据。
简单来说,你在HBase中的表创建的可以看做是一张很大的表,而这个表的属性可以根据需求去动态增加,在HBase中没有表与表之间关联查询。你只需要 告诉你的数据存储到Hbase的那个column families 就可以了,不需要指定它的具体类型:char,varchar,int,tinyint,text等等。但是你需要注意HBase中不包含事务此类的功能。
Apache HBase 和Google Bigtable 有非常相似的地方,一个数据行拥有一个可选择的键和任意数量的列。表是疏松的存储的,因此用户可以给行定义各种不同的列,对于这样的功能在大项目中非常实用,可以简化设计和升级的成本。
HBase的存储结构
HBase 是基于列的数据库,让我们看一下关系型数据库和hbase数据库存储的对比。
行式存储和列式存储对比:
行式存储
- 数据是按行存储的
- 没有索引的查询使用大量I/O
- 建立索引和物化视图需要花费大量时间和资源
- 面对查询的需求,数据库必须被大量膨胀才能满足性能要求
列式存储
数据按列存储——每一列单独存放
数据即是索引
只访问查涉及的列——大量降低系统IO
每一列由一个线索来处理——查询的并发处理
数据类型一致,数据特征相似——高效压缩
HBase与关系型数据库的对比
HBase 是基于
下面的表格中hbase和RDBMS的对比关系
HBase |
RDBMS |
|
数据类型 |
只有字符串 |
丰富的数据类型 |
数据操作 |
简单的增删改查 |
各种各样的函数,表连接 |
存储模式 |
基于列存储 |
基于表格结构和行存储 |
数据保护 |
更新后旧版本仍然会保留 |
替换 |
可伸缩性 |
轻易的进行增加节点,兼容性高 |
需要中间层,牺牲功能 |