一、Hbase和Hive
HBase 是一种类似于数据库的存储层,也就是说 HBase 适用于结构化的存储。并且 HBase 是一种列式的分布式数据库。
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。属于非关系型数据库。
HBase是基于Google BigTable模型开发的,典型的key/value系统;
HBase 底层依旧依赖 HDFS 来作为其物理存储,这点类似于 Hive。
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。
1.实时性:
Hive 适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive 不应该用来进行
实时的查询(Hive 的设计目的,也不是支持实时的查询)。因为它需要很长时间才可以返回结果;
HBase 则非适合用来进行大数据的实时查询,例如 Facebook 用 HBase 进行消息和实时的分析。
2.部署:
Hive 一般只要有 Hadoop 便可以工作。
HBase 则还需要 Zookeeper 的帮助(Zookeeper,是一个用来进行布式协 调的服务,这些服务包括配置服务,维护元信息和命名空间服务)
3.SQL查询:
HBase 本身只提供了 Java 的 API 接口,并不直接支持 SQL 的语句查询。
Hive 则可以直接使用 HQL(一种类SQL 语言)。
如果想要在 HBase 上使用 SQL,则需要联合使用 Apache Phonenix,或者联合使用 Hive 和HBase。
但是和上面提到的一样,如果集成使用 Hive 查询 HBase 的数据,则无法绕过 MapReduce,
那么实时性还是有一定的损失。Phoenix 加 HBase 的组合则不经过 MapReduce 的框架,
因此当使用 Phoneix加 HBase 的组成,实时性上会优于 Hive 加 HBase 的组合。
4.存储层:
默认情况下 Hive 和 HBase 的存储层都是 HDFS。
但是 HBase 在一些特殊的情况下也可以直接使用本机 的文件系统。例如 Ambari 中的 AMS 服务直接在本地文件系统上运行 HBase
二、Hbase与传统数据库(RDBMS,全称为 Relational Database Management System)
表 1. HBase 与 RDBMS 的区别
| Hbase | RDBMS |
硬件架构 | 类似于 Hadoop 的分布式集群,硬件成本低廉 | 传统的多核系统,硬件成本昂贵 |
容错性 | 由软件架构实现,由于由多个节点组成,所以不担心一点或几点宕机 | 一般需要额外硬件设备实现 HA 机制 |
数据库大小 | PB | GB、TB |
数据排布方式 | 稀疏的、分布的多维的 Map | 以行和列组织 |
数据类型 | Bytes | 丰富的数据类型 |
数据操作 | 插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系 | 传统数据库通常有各式各样的函数和连接操作 |
数据维护 | Hbase的更新实际上是插入了新的数据 | 传统数据库只是替换和修改 |
事物支持 | ACID 只支持单个 Row 级别 | 全面的 ACID 支持,对 Row 和表 |
查询语言 | 只支持 Java API (除非与其他框架一起使用,如 Phoenix、Hive) | SQL |
索引 | 只支持 Row-key,除非与其他技术一起应用,如 Phoenix、Hive | 支持 |
吞吐量 | 百万查询/每秒 | 数千查询/每秒 |
事务 | Hbase只可以实现单行的事务性,意味着行与行之间、表与表之前不必满足事务性 | 传统数据库是可以实现跨行的事务性 |
存储模式:
Hbase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,
这样的好处是数据即是索引,访问查询涉及的列大量降低系统的I/O,并且每一列由一个线程来处理,
可以实现查询的并发处理;
传统数据库是基于表格结构和行存储,其没有建立索引将耗费大量的I/O并且建立索引和物化试图需要
耗费大量的时间和资源。