1、HBase 数据库
1.1、产生背景
自 1970 年以来,关系数据库用于数据存储和维护有关问题的解决方案。大数据的出现后,好多公司实现处理大数据并从中受益,并开始选择像 Hadoop 的解决方案。Hadoop 使用分布式文件系统,用于存储大数据,并使用 MapReduce 来处理。Hadoop 擅长于存储各种格式的庞大的数据,任意的格式甚至非结构化的处理。
Hadoop 的限制
Hadoop 只能执行批量处理,并且只以顺序方式访问数据。这意味着必须搜索整个数据集,即使是最简单的搜索工作。当处理结果在另一个庞大的数据集,也是按顺序处理一个巨大的数据集。
在这一点上,一个新的解决方案,需要访问数据中的任何点(随机访问)单元。
Hadoop 随机存取数据库
应用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存储大量数据和以随机方式访问数据的数据库。
1.2、简介
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, mongodb
RDBMS:mysql,oracle,sql server,db2
HBase 这个 NoSQL 数据库的要点:
① 它介于 NoSQL 和 RDBMS 之间,仅能通过主键(rowkey)和主键的 range 来检索数据
② HBase 查询数据功能很简单,不支持 join 等复杂操作
③ 不支持复杂的事务,只支持行级事务(可通过 hive 支持来实现多表 join 等复杂操作)。
Stay hungry Stay foolish -- http://blog.youkuaiyun.com/zhongqi2513
④ HBase 中支持的数据类型:byte[](底层所有数据的存储都是字节数组)
⑤ 主要用来存储结构化和半结构化的松散数据。
结构化:数据结构字段含义确定,清晰,典型的如数据库中的表结构
半结构化:具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title),
有些不确定(table)
非结构化:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性
与 Hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加
计算和存储能力。
HBase 中的表特点
1、大:一个表可以有上十亿行,上百万列
2、面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
4、无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一
张表中不同的行可以有截然不同的列
1.3、表结构逻辑视图
1.3.1、行键(RowKey)
与 NoSQL 数据库们一样,rowkey 是用来检索记录的主键。访问 HBase Table 中的行,只有三种方式:
1、通过单个 row key 访问
2、通过 row key 的 range
3、全表扫描
rowkey 行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes)。在 HBase 内部,rowkey 保存为字节数组。HBase 会对表中的数据按照 rowkey 排序(字典顺序)
存储时,数据按照 rowkey 的字典序(byte order)排序存储。设计 key 时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
1.3.2、列簇(Column Family)
- HBase 表中的每个列,都归属与某个列簇。列簇是表的 Schema 的一部分(而列不是),必须在使用表之前定义好,而且定义好了之后就不能更改。
- 列名都以列簇作为前缀。例如 courses:history,courses:math 都属于 courses 这个列簇。访问控制、磁盘和内存的使用统计等都是在列簇层面进行的。
- 列簇越多,在取一行数据时所要参与 IO、搜寻的文件就越多,所以,如果没有必要,不要设置太多的列簇(最好就一个列簇)
1.3.3、时间戳(TimeStamp)
HBase 中通过 rowkey 和 columns 确定的为一个存储单元称为 cell。每个 cell 都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型。时间戳可以由hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase 提供了两种数据版
本回收方式:
- 保存数据的最后 n 个版本
- 保存最近一段时间内的版本(设置数据的生命周期 TTL)。
1.3.4、单元格(CelL )
由{rowkey, column( =<family> + <column>), version} 唯一确定的单元。Cell 中的数据是没有类型的,全部是字节码形式存贮。