1. Hadoop生态系统
- 底层是存储(HDFS),上层是计算框架
- 从图中可以看出,Hive、Pig和Mahout是基于MapReduce的计算框架,分别用于结构化数据的即席查询,数据流处理以及基于MapReduce的机器学习算法集
- HBase依赖于HDFS,HBase这个圆角矩形框在高度上= MapReduce + 基于MapReduce的计算框架,这是不是说,HBase一部分是跟MapReduce平级,属于基础框架级,同时又提供了应用级的能力
2. 什么是HBase
- HBase是基于Apache Hadoop的面向列的NoSQL数据库,是Google的BigTable的开源实现。
- HBase是一个针对结构化数据的开源的、多版本的、可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。和传统关系数据库不同,HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。
- HBase提供了对大规模数据的随机、实时读写访问
- HBase的目标是存储并处理大型的数据,更具体地说仅用普通的硬件配置,能够处理上千亿的行和几百万的列所组成的超大型数据库。
- HBase是一个开源的、分布式的、多版本的、面向列的存储模型。可以直接使用本地文件系统也可使用Hadoop的HDFS文件存储系统。
- HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。
- HBase具有"向下提供存储,向上提供运算"的特点,这跟上图就对应起来了,比如Hive on HBase,即HBase为Hive计算提供输入数据
- HBase数据模型:Schema-->Table-->Column Family-->Column-->RowKey-->TimeStamp-->Value
- 从逻辑上讲,HBase将数据按照表、行和列进行存储
3. HBase系统架构图
4. HBase与HDFS对比
- HBase和HDFS都是良好的容错性和扩展性,都可以扩展到成百上千个节点
- HDFS适用于读取的整存整取,即批处理场景
- HBase适合数据的随机读取,而HDFS不能用于数据随机读取,只用于顺序扫描所有数据
- HDFS不适合增量数据处理,而HBase适合((只处理新增数据)
- HDFS不适合增量数据更新(即写操作),而HBase则适合百万级并发写操作
5. HBase表的特点
- 海量存储: 一个表可以有数十亿行,上百万列
- 行无固定模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列。这个可排序的主键是rowKey吗?
- 面向列: 面向列(族)的存储和权限控制,列(族)独立检索
- 空列: 对于空(null)的列,并不占用存储空间,表可以设计的非常稀疏
- 数据带有多版本: 每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
- 数据类型单一: Hbase中的数据都是字符串,没有类型,字符串转换成其他类型需要自己实现
6.行存储 vs 列存储
6.1 行存储
行存储的特点:
- 数据是按行存储的
- 没有索引的查询使用大量I/O(因为首先要扫描行,再扫描列。因为行是离散的所以,需要继续IO定位行)
- 建立索引和物化视图需要花费大量时间和资源
- 面向查询的需求,数据库必须被大量膨胀才能满足性能要求
6.2 列存储
列存储的特点:
- 数据是按列存储-每一列单独存放
- 数据即是索引
- 仅需要访问查询涉及的列-大量降低系统I/O
- 每一列由一个线程来处理-查询的并发处理(列出通常来说不会很大)
- 数据类型一致,数据特征相似-高效压缩