Hive - 核心原理、特点、以及架构详解(附:与数据库对比)
作者:hangge | 2024-09-04 08:59
1,什么是 Hive?
(1)Hive 是由 Facebook 开源的一款数据分析工具,主要用来进行数据提取、转化和加载(ETL),于 2010 年正式成为 Apache 的顶级项目。
(2)Hive 的出现主要是为了解决 MapReduce 程序开发复杂的问题,它提供了通过 SQL 分析 HDFS 中海量数据的能力,大大减少了开发人员的工作量,提高了数据分析效率。
(3)Hive 是一个基于 Hadoop 的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的 SQL 查询功能,可以执行包括 Join 在内的复杂查询。Hive 是建立在 Hadoop 之上的,因此它可以将 SQL 语句转换为 MapReduce 任务执行,使得不熟悉 MapReduce 的用户可以很方便地利用 Hive 进行数据统计。
2,Hive 原理
(1)Hive 中定义了简单的类 SQL 查询语言(QL)。它允许熟悉 SQL 的用户直接查询 HDFS 中的海量数据。同时,该语言也允许熟悉 MapReduce 的开发者自定义 MapReduce 任务来处理内置的 SQL 函数无法完成的复杂分析任务。
注意:
- Hive 的数据存储是基于 HDFS 的,它既没有自己的存储系统,也没有专门的数据存储格式。
- Hive 默认可以直接加载普通文本文件(extFile),也支持 SequenceFile、RCFile 等格式文件。针对文本文件中的数据,在使用 Hive 创建表时,只需要指定数据的列分隔符和行分隔符,Hive 即可解析文件中的数据。
(2)Hive 通过给用户提供的一系列交互接口,接收到用户的指令(QL),使用自己的 Driver,结合元数据 (MetaStore),将这些指令翻译成 MapReduce,提交到 Hadoop 中执行,最后,将执行返回的结果输出 到用户交互接口。
也可以这样理解:Hive 要做的就是将 SQL 翻译成 MapReduce 程序代码。实际上,Hive 内置了很多 Operator,每个 Operator 完成一个特定的计算过程,Hive 将这些 Operator 构造成一个有向无环图 DAG,然后根据这些 Operator 之间是否存在 shuffle 将其封装到 map 或者 reduce 函数中,之后就可以提 交给 MapReduce 执行了。
(3)Hive 中最核心的一个组件就是 SQL 解析引擎,它会将 SQL 语句解析成 MapReduce 任务,具体的解析流程如下图所示:
- 1. 进入程序,利用 Antlr 框架定义 HQL 的语法规则,对 HQL 完成词法语法解析,将 HQL 转换为为 AST(抽象语法树);
- 2. 遍历 AST,抽象出查询的基本组成单元 QueryBlock(查询块),可以理解为最小的查询执行单元;
- 3. 遍历 QueryBlock,将其转换为 OperatorTree(操作树,也就是逻辑执行计划),可以理解为不可拆分的一个逻辑执行单元;
- 4. 使用逻辑优化器对 OperatorTree(操作树)进行逻辑优化。例如合并不必要的 ReduceSinkOperator,减少 Shuffle 数据量;
- 5. 遍历 OperatorTree,转换为 TaskTree。也就是翻译为 MR 任务的流程,将逻辑执行计划转换为物理执行计划;
- 6. 使用物理优化器对 TaskTree 进行物理优化;
- 7. 生成最终的执行计划,提交任务到 Hadoop 集群运行。
3,Hive 的特点
(1)Hive 主要具备以下几个优点:
- 易上手:提供了类 SQL 查询语言 HQL,避免开发 MapReduce 任务,减少了学习成本。
- 可扩展:底层基于 Hadoop,扩展性比较好。
- 延展性:支持自定义函数来解决内置函数无法实现的功能。
(2)Hive 也存在一些缺点:
- Hive SQL 表达能力有限:SQL 无法表达迭代式算法,以及数据挖掘方面的需求。
- 计算效率一般:Hive 底层会默认生成 MapReduce 任务,计算效率一般,但是稳定性较高。
注意:Hive 的底层计算引擎默认是 MapReduce。从 Hive 3.x 版本开始,官方建议使用 Tez 引擎或者 Spark 引擎,这样可以进一步提升 Hive 的计算性能。
4,Hive 与数据库对比
(1)在刚开始接触 Hive 时,可以把 Hive 当成数据库来使用,这样便于理解。但是 Hive 并不是一个数据库,它实际上是一个数据仓库。Hive 侧重的是数据分析,而不是增删改查功能,它是不支持修改和删除操作的。
(2)为了加深对 Hive 的理解,下面针对 Hive 和 MySQL 中的一些特性进行对比:
比较项 | Hiye | MySQL |
数据存储位置 | HDFS | 本地磁盘 |
数据格式 | 用户自定义 | 系统决定 |
数据更新 | 不支持 | 支持 |
索引 | 有,较弱,很少使用 | 有,经常使用 |
执行引擎 | MapReduce | Executor |
执行延迟 | 高 | 低 |
可扩属性 | 高 | 低 |
数据规模 | 大 | 小 |
5,Hive 架构
(1)Hive 的整个体系架构都是构建在 Hadoop 之上的,Hive 的元数据被存储在 MySQL 中,普通数据被存储在 HDFS 中,SQL 语句在底层会被转化为 MapReduce 任务,最终在 YARN 上执行。
(2)具体说明如下:
- 用户接口:包括 CLI、JDBC/ODBC、Web UI
- CLI,即 Shell 命令行,表示我们可以通过 shell 命令行操作 Hive
- JDBC/ODBC 是 Hive 的 Java 操作方式,与使用传统数据库 JDBC 的方式类似
- Web UI 是通过浏览器访问 Hive
- 元数据存储(Metastore):一个存储系统,主要负责存储 Hive 中的元数据。元数据包括:表的名字、表的列、表的分区、表的属性(是否为外部表)、表的数据所在的 HDFS 目录等。目前 Metastore 只支持 Derby 和 MySQL,而且 Derby 只能用于测试环境,在生产环境中需要使用 MySQL。
- 在同一个目录下一次只能打开一个会话
- 使用 derby 存储方式时,Hive 会在当前目录生成一个 derby.log 文件和一个 metastore_db 目录,metastore_db 里面会存储具体的元数据信息
- 如果下次切换到一个另一个新目录访问 Hive,则会重新生成 derby.log 文件和 metastore_db 目录,这样就没有办法使用之前的元数据信息了。
- 推荐使用 MySQL 作为外置存储引擎,可以支持多用户同时访问以及元数据共享。
- Driver:包括编译器、优化器和执行器。可以完成 Hive SQL 的词法分析、语法分析、编译、优化,以及查询计划的生成,属于 Hive 中的核心组件。
- Hadoop:Hive 会使用 HDFS 进行存储,利用 MapReduce 进行计算。
Metastore 默认使用内嵌的 derby 数据库,但是 Derby 数据库存在如下缺点:
注意:大部分的查询由 MapReduce 完成,但存在特例 select * from table 不会生成 MapRedcue 任务,如果在 SQL 语句后面再增加 where 过滤条件就会生成 MapReduce 任务了。
附:对比 Hive、Impala 和 Kylin
Hive、Impala 和 Kylin 都适合应用于离线 OLAP 数据分析领域,不过它们各有特色,在技术选型时需要结合具体业务需求进行考虑。这 3 个离线 OLAP 引擎的对比如下。说明:
- 计算引擎:Hive 的计算引擎默认是 MapReduce,也支持 Tez 或者 Spark。Impala 的计算引擎是通过 C++ 自研的 MPP 引擎。Kylin 的计算引擎可以使用 MapReduce 或者 Spark。
- 计算性能:Hive 底层会使用 MapReduce,所以计算性能相对一般,不过可以考虑使用 Tez 或者 Spark 引擎来提高性能。Impala 是基于内存计算的,计算性能比较好。Kylin 底层可以使用 MapReduce 或者 Spark 引擎,使用 Spark 引擎时计算性能也比较好。
- 稳定性:Impala 是全部基于内存的,所以稳定性较差。Hive 和 Kylin 底层都可以使用 MapReduce,所以稳定性相对较高。
- 数据规模:Hive 比较适合 TB 级别的数据分析,数据规模太大会导致计算时间过长。Impala 也比较适合 TB 级别的数据分析,如果数据规模太大则内存会出现瓶颈。Kylin 比较适合 TB 和 PB 级别的数据分析,因为它会提前对数据进行预计算,在海量数据下也可以提供较好的性能。
- SQL 支持程度:在 Hive 中定义了简单的类 SQL 查询语言(QL)。Impala 可以兼用 HQL。Kylin 支持标准 SQL。
全部评论(0)