一、产生背景
自1970年以来,关系数据库用于数据存储和维护有关问题的解决方案。大数据的出现后,好多公司实现处理大数据并从中受益,并开始选择像Hadoop的解决方案。Hadoop使用分布式文件系统,用于存储大数据,并使用MapReduce来处理。Hadoop擅长于存储各种格式的庞大的数据,任意的格式甚至非结构化数据的处理。
Hadoop的限制
Hadoop只能执行批量处理,并且只以顺序方式访问数据。这意味着必须搜索整个数据集,即使是最简单的搜索工作。当处理结果在另一个庞大的数据集,也是按顺序处理一个巨大的数据集。在这一点上,一个新的解决方案,需要访问数据中的任何点(随机访问)单元。
Hadoop随机存取数据库
应用程序,如HBase,Cassandra,CouchDB,Dynamo和 MongoDB 都是一些存储大量数据和 以随机方式访问数据的数据库。
总结:
1、海量数据量存储成为瓶颈,单台机器无法负载大量数据。
2、单台机器IO读写请求成为海量数据存储时候高并发大规模请求的瓶颈
3、随着数据规模越来越大,大量业务场景开始考虑数据存储横向水平扩展,使得存储服务可以增加/删除,而目前的关系型数据库更专注于一台机器
二、Hbase简介
Hbase是BigTable(源码使用Java编写)版本。是Apache Hadoop的数据库,是建立在HDFS之上,被设计用来提供高可靠性、高性能、、列存储、可伸缩、多版本的NoSQL的分布式数据存储系统,实现对大型数据的实时,随机的读写访问。
Hbase依赖于HDFS做底层的数据存储,BigTable依赖于Google GFS做数据存储
Hbase依赖于Mapreduce做数据计算,BigTable依赖于Google MapReduce做数据计算
HBase依赖于Zookeeper做服务协调,BigTable依赖Google Chubby做服务协调
三、关系型数据库和非关系型数据库的典型代表
NoSQL:Hbase、redis、Mongdb
RDBMS:mysql,oracle、sqlserver,db2
四、Hbase这个NOsql数据库的要点
1、它介于NoSQL和RDBMS之间,仅能通过主键(rowkey)和主键的range([startkey,endkey))来检索数据
2、Hbase查询数据功能很简单,不支持join等复杂操作
3、不支持复杂的事务,只支持行级事务(可以通过hive支持来实现多表join等复杂操作)
4、Hbase中支持的数据类型:Byte[] (底层所有数据的存储都是字节数组)
5、主要用来存储结构化数据和半结构化的松散数据。
6、列可以动态增加,并且列为空就不存储数据,节省存储空间
五、Hbase中的表特点
1、大:一个表可以有上十亿行,上白袜列
2、面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
4、无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一 张表中不同的行可以有截然不同的列
六、Hbase表结构逻辑视图
初次接触HBase,可能看到以下描述会懵:“基于列存储”,“稀疏MAP”,“RowKey”,“ColumnFamily”。
其实没那么高深,我们需要分两步来理解HBase, 就能够理解为什么HBase能够“快速地”“分布式地”处理“大量数据”了。
1.内存结构
2.文件存储结构
七、名词概念
假如我们有如下一张表
1、Rowkey概念
Rowkey的概念和mysql中的主键是完全一样,Hbase使用Rowkey来唯一的区分某一行的数据。
由于Hbase只支持3中查询方式:
a、基于Rowkey的单行查询
b、基于Rowkey的范围扫描
c、全表扫描
因此,Rowkey对Hbase的性能影响非常大,Rowkey的设计就显得尤为的重要。设计的时候要兼顾基于Rowkey的单行查询也要键入Rowkey的范围扫描。rowkey 行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),最好是 16。在 HBase 内部,rowkey 保存为字节数组。HBase 会对表中的数据按照 rowkey 排序 (字典顺序)