1. hbase数据库介绍
1.1 产生背景
自 1970 年以来,关系数据库用于数据存储和维护有关问题的解决方案。大数据的出现后, 好多公司实现处理大数据并从中受益,并开始选择像 Hadoop 的解决方案。Hadoop 使用分 布式文件系统,用于存储大数据,并使用 MapReduce 来处理。Hadoop 擅长于存储各种格式 的庞大的数据,任意的格式甚至非结构化的处理。
Hadoop 的限制
Hadoop 只能执行批量处理,并且只以顺序方式访问数据。这意味着必须搜索整个数据集, 即使是最简单的搜索工作。当处理结果在另一个庞大的数据集,也是按顺序处理一个巨大的 数据集。在这一点上,一个新的解决方案,需要访问数据中的任何点(随机访问)单元。
Hadoop 随机存取数据库应用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存储大量数据和 以随机方式访问数据的数据库。
Hadoop 的特点:
对于任意格式的庞大数据集,Hadoop 可以做到安全存储
但是对于需要在庞大数据集做针对于单条记录的增删改查是做不到的。有一个操作例外:追加
Hive 的特点:
对于存储在 HDFS 上的结构化的数据,如果增加一些描述这些数据的元数据信息,那么我们 可以把存储在 HDFS 上的数据抽象成一张二维表格,使用 Hive 进行各种 Insert/Select 操作。 但是 Hive 还是天生不支持对于单条记录的增删改查,也不是设计用来做单条记录的增删改 查的。
总结:
- 海量数据量存储成为瓶颈,单台机器无法负载大量数据
- 单台机器 IO 读写请求成为海量数据存储时候高并发大规模请求的瓶颈
- 随着数据规模越来越大,大量业务场景开始考虑数据存储横向水平扩展,使得存储服务可以增加/删除,而目前的关系型数据库更专注于一台机器
重要问题探讨:如何设计一个能存储庞大数据集,同时也能做到实时增删改查的数据库系统?
相当于设计一个 MySQL 的分布式版本。
先解决这个问题,再来学习别人的成果,这是一种较好的学习方式。而不是一上来便学习别 人的成功。须知:已掌握的知识会限制我们的思维方式。
类似问题:
- 如何设计一个分布式文件系统?
- 如何设计一个分布式计算框架?
- 如何设计一个分布式数据库? 他们的难点是什么?
思路引爆点:
- 怎样快速判断一个元素在不在一个数据集中?布隆过滤器
- 是否能找到一种合适的数据结构和搜索算法能快速从一个数据集中找出一个元素?二分 查找
- 如何设计分布式系统?网络编程模型(NIO RPC Netty)
- 是否可以提前过滤不参与查询的数据,提高查询效率?列裁剪
1.2 简介
HBase 是 Hadoop Database 的简称,Hbase 项目是由 Powerset 公司的 Chad Walters 和 Jim Kelleman 在 2006 年末发起,根据 Google 的 Chang 等人发表的论文"Bigtable:A Distributed Storage System for Strctured Data "
来设计的。
2007 年 10 月发布了第一个版本。
2010 年 5 月,HBase 从 Hadoop 子项目升级成 Apache 顶级项目。
官网: http://hbase.apache.org/
- Apache HBaseTM is the Hadoop database, a distributed, scalable, big data store.
- Use Apache HBaseTM when you need random, realtime read/write access to your Big Data.
- This project’s goal is the hosting of very large tables – billions of rows X millions of columns – atop clusters of commodity hardware.
- Apache HBase is an open-source, distributed, versioned, non-relational database modeled after Google’s Bigtable: A Distributed Storage System for Structured Data by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS.
HBase 是 BigTable 的开源(源码使用 Java 编写)版本。是 Apache Hadoop 的数据库,是建 立在 HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL 的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。
HBase 依赖于 HDFS 做底层的数据存储,BigTable 依赖 Google GFS 做数据存储
HBase 依赖于 MapReduce 做数据计算,BigTable 依赖 Google MapReduce 做数据计算
HBase 依赖于 ZooKeeper 做服务协调,BigTable 依赖 Google Chubby 做服务协调
与 Hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加 计算和存储能力。所以,HBase 是一个通过大量廉价机器解决海量数据的高速存储和读取的分布式数据库解决方案
NoSQL = NO SQL
NoSQL = Not Only SQL:会有一些把 NoSQL 数据的原生查询语句封装成 SQL,比如 HBase 就 有 Phoenix 工具
关系型数据库 和 非关系型数据库的典型代表:
NoSQL: HBase, Redis, MongoDB
RDBMS: MySQL, Oracle, SQL Server, DB2
以下五点是 HBase 这个 NoSQL 数据库
的要点:
- 高并发,以扩展,解决海量数据集的随机实时增删改查
- HBase 本质依然是 Key-Value 数据库,查询数据功能很简单,不支持 join 等复杂操作(可通过 Hive 支持来实现多表 join 等复杂操作)
- 不支持复杂的事务,只支持行级事务
- HBase 中支持的数据类型:byte[] (底层所有数据的存储都是字节数组)
- 主要用来存储结构化和半结构化的松散数据。
关于结构化数据分类:
结构化
: 数据结构字段含义确定,清晰,典型的如数据库中的表结构半结构化
: 具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title), 有些不确定(table)非结构化
: 杂乱无章的数据,很难按照一个概念去进行抽取,无规律性
HBase 中的表
特点
大
:一个表可以有上十亿行,上百万列面向列
:列可以灵活指定,面向列(族)的存储和权限控制,列(簇)独立检索。稀疏
:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。无严格模式
:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加, 同一张表中不同的行可以有截然不同的列
关于存储系统的模式介绍:
读模式
:在读取数据的时候做模式校验,比如数据仓库 Hive写模式
:在写入数据进入存储系统的时候做模式校验,比如 RDBMS
2. hbase 集群结构
Client:
Client 包含了访问 HBase 的接口,另外 Client 还维护了对应的 Cache 来加速 HBase 的访问,比如 Cache 的.META.元数据的信息。Zookeeper:
整个 HBase 中的主从节点协调,元数据的入口,主节点之间的选举,集群节点之间的上下线感知……都是通过 ZooKeeper 来实现HMaster:
HBase 的主节点,负责整个集群的状态感知、负载分配、负责用户表的元数据(schema)管理(可以配置多个用来实现 HA),HMaster 负载压力相对于 HDFS 的 NameNode会小很多。HBase 的 HMaster 其实就算是宕机一段时间也可以正常对外提供服务的(要搞清楚为什么)。RegionServer:
HBase 中真正负责管理 Region 的服务器,也就是负责为客户端进行表数据读写的服务器。每一台 RegionServer 会管理很多的 Region,一个 RegionServer 上面管理的所有的region不属于同一张表。负责Region的拆分,负责和底层的HDFS的存储交互,负责StoreFile的合并。Region:
HBase 将一个表中的所有数据按照 RowKey 的不同范围进行切割的逻辑单元,每 个 Region 负责一定范围数据的读写访问。Region 由 RegionServer 负责管理。HBase 中的 Region的概念就和 HDFS 中的数据块的概念差不多,Region 是 HBase 表切分出来的一个分片。数据块是 HDFS 中的一个大文件切分出来的一个分片。HDFS:
用来存储 HBase 的系统文件,或者表的 Region 文件
3. hbase和hive比较
3.1 相同点
HBase 和 Hive 都是架构在 Hadoop 之上,用 HDFS 做底层的数据存储,用 MapReduce 做数据计算
3.2 不同点
- Hive 是建立在 Hadoop 之上为了降低 MapReduce 编程复杂度的 ETL 工具。
HBase 是为了弥补 Hadoop 对实时操作的缺陷 - Hive 表是纯逻辑表,因为 Hive 的本身并不能做数据存储和计算,而是完全依赖 Hadoop
HBase 是物理表,提供了一张超大的内存 Hash 表来存储索引,方便查询 - Hive 是数据仓库工具,需要全表扫描,就用 Hive,因为 Hive 是文件存储
HBase 是数据库,需要索引访问,则用 HBase,因为 HBase 是面向列的 NoSQL 数据库 - Hive 表中存入数据(文件)时不做校验,属于读模式存储系统
HBase 表插入数据时,会和 RDBMS 一样做 Schema 校验,所以属于写模式存储系统 - Hive 不支持单行记录操作,数据处理依靠 MapReduce,操作延时高
HBase 支持单行记录的 CRUD,并且是实时处理,效率比 Hive 高得多