Hive 概述
# 什么是 Hive
Apache Hive 是一个款建立在 Hadoop 之上的开源数据仓库系统,可以将存储在 Hadoop 中的的结构化和半结构化数据映射为一张数据库表,基于表提供了一种类 SQL 查询语言(HQL),虽然名字叫做 HQL,但是很多场景下和 SQL 的语法是相似的。
为什么说 Hive 是建立在 Hadoop 之上的呢?
- Hive 的数据是存储在 HDFS 上的
- 计算是由 MapReduce 完成的
- 任务调度是由 Yarn 完成的
Hive 的作用是将 HQL 转化为 MapReduce 程序并提交到 Hadoop 集群执行,最早是由 Facebook 开源,用以解决海量结构化日志统计的工具。
# Hive 的优缺点
# 优点
- 用 SQL 化的方式代替了繁琐的 MapReduce 程序
- 开发人员容易上手,减小了开发人员的学习成本
- 支持自定义函数(UDF),方便功能扩展
- 基于 Hadoop 可以实现海量数据分析
- 可以水平扩展
# 缺点
- Hive 执行延迟比较高,所以 Hive 适合对离线计算或者对实时性要求不高的场景
- Hive 在小数据集处理方面不占优势
- HQL 表达能力有限
- 迭代计算无法表达
- 调优比较困难,可控制粒度较大
# Hive 架构
Hive 的架构可以分为以下几个组件:
- 用户接口:包括 CLI、JDBC/ODBC、WEBUI。其中,CLI(command line interface)为 shell 命令行;Hive 中的 Thrift 服务器允许外部客户端通过网络与 Hive 进行交互,类似于 JDBC 或 ODBC 协议。WebGUI 是通过浏览器访问 Hive。
- 元数据(Metastore):用以存储 Hive 中的库、表、列、注释、分区、表属性等信息。默认是存储在 Hive 自带的 Derby 数据库中的,企业中一般会通过配置将其存储到 MySQL 中。
- Driver 驱动程序:Driver 驱动程序包括解析器(SQL Parser)、编译器(Physical Plan)、优化器(Query Optimize)、执行器(Execution)。解析器将 SQL 字符串转换成抽象语法树 AST,并对抽象语法树进行分析,比如判断字段是否存在、类型是否合理等,编译器负责将 AST 编译成逻辑执行计划,并由优化器对逻辑执行计划进行优化,最后由执行器将逻辑执行计划转换为屋里运行计划。
- 执行引擎:Hive 本身是不会处理数据的,而是通过执行引擎来处理。默认的执行引擎就是 MapReduce,但是可以通过配置将执行引擎替换为 Spark、Tez 或者 Presto 等。
# Hive 和数据库的区别
由于 Hive 使用了类 SQL 的查询语言,容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在 Online 的应用中,但是 Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。
- 查询语言
HQL 和 SQL 只是大部分语法比较相似,并不完全一样。由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。
- 数据规模
由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;而数据库可以支持的数据规模较小。
- 执行引擎
Hive 的执行引擎默认是 MapReduce,但是可以通过配置由 Spark、Flink、Tez、Presto 等代替,而数据库使用的是自己的执行引擎。
- 数据存储
Hive 的数据都是存储在 HDFS 中的,而数据库是将数据保存在本地文件系统或裸设备中。
- 执行速度
Hive 存储的数据量大,在查询数据的时候,通常没有索引,需要扫描整个表;加之 Hive 使用 MapReduce 作为执行引擎,这些因素都会导致较高的延迟。而 RDBMS 对数据的访问通常是基于索引的,执行延迟较低。当然这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出并行的优势。
- 可扩展
Hive 支持水平扩展,数据库通常支持垂直扩展,对水平扩展不友好。Hive 建立在 Hadoop 之上,其可扩展性与 Hadoop 的可扩展性是一致的(Hadoop 集群规模可以轻松超过 1000 个节点)。而 RDBMS 由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有 100 台左右。
- 数据更新
Hive 对数据更新不友好,数据库支持频繁、快速的数据更新。Hive 是针对数据仓库应用设计的,数据仓库的内容是读多写少的。因此,Hive 中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而 RDBMS 中的数据需要频繁、快速的进行更新。
- 索引
Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。