Hive 引擎底层初探
作者:京东物流 沈世莹
1、什么是 Hive
Hive 是一个基于 Hadoop 的数据仓库工具,用于处理和分析大规模结构化数据。Hive 提供了类似 SQL 的查询语言(HiveQL),使得熟悉 SQL 的用户能够查询数据。Hive 将 SQL 查询转换为 MapReduce 任务,以在 Hadoop 集群上执行数据处理和分析。
2、Hive 起源
回答这个问题之前,先介绍下 Hadoop。Hadoop 是专门为离线和大数据分析而设计的分布式基础架构。Hadoop 的计算模型是 MapReduce,将计算任务分割成多个处理单元,并将其分散到一群家用或服务级别的硬件机器上,从而降低成本。但是直接用 MapReduce 处理大数据会面临难题:
•MapReduce 开发需要具备较高的底层细节知识,开发难度大,学习成本高
•使用 MapReduce 框架开发,项目周期长,成本高
在此背景下 Hive 应运而生。Hive 是基于 Hadoop 的一个数据仓库工具,本质是将 SQL 转换成 MapReduce 任务进行运算。将结构化的数据文件映射为一张数据库表,并提供简单的 sql 查询功能,极大降低用户使用难度。
3、Hive 架构
3.1 基本组成部分
Hive 的架构是一个复杂的系统,通过用户接口、元数据存储、驱动器和 Hadoop 集群等多个组件的协同工作,实现了对大规模数据的高效存储和查询处理。其架构图如下图所示。

•用户接口模块
这是用户与 Hive 进行交互的主要方式。Hive 提供了多种用户接口,包括 CLI(命令行接口)、Client(客户端)、WUI(Web 用户界面)以及 JDBC/ODBC(允许 Java 或其他编程语言通过 JDBC 或 ODBC 访问 Hive)。通过这些接口,用户可以执行 HQL(Hive 查询语言)语句,进行数据的查询、分析和管理。
BDP 平台将页面的 SQL 转换成 SHELL 脚本,调用 CLI 来启动 Hive 引擎。


•元数据模块
Hive 是将数据文件映射成一张表,元数据模块主要负责描述和管理数据存储、表结构、分区信息等,通常存储在关系型数据库中,如 MySQL 或 Derby。

•驱动器(Driver)
驱动器是 Hive 的核心组件,主要作用是将 HiveQL 语句转换成一系列的 MapReduce(MR)作业。驱动器中包含了解析器、编译器、优化器和执行器等多个子组件。解析器将用户的 HQL 查询语句转换为抽象语法树(AST),编译器将 AST 编译成逻辑执行计划,优化器对逻辑计划进行优化,最后执行器将优化后的计划转换成可以运行的物理计划并执行。

•Hadoop 集群
Hive 是建立在 Hadoop 上的数据仓库基础构架,因此 Hadoop 集群是 Hive 架构的重要组成部分。Hive 使用 Hadoop 的分布式文件系统(HDFS)进行数据存储,利用 Hadoop 的 MapReduce 框架进行大规模数据的计算和处理。
3.2 Hadoop
Hadoop 是开源的分布式存储和计算系统,旨在处理大规模数据集。它最初由 Apache 软件基金会开发,现已成为处理大数据的行业标准之一。Hadoop 主要包括以下核心组件:HDFS、MapReduce。
3.2.1 分布式文件系统(HDFS)
HDFS 是 Hadoop 的分布式文件系统,用于存储大规模数据集。它将数据分布存储在集群中的多台服务器上,通过数据冗余存储来提供容错性和高可靠性。
◦高可靠性
HDFS 它将文件数据划分为多个数据块,并在集群中的多个节点上进行复制存储。每个数据块默认会有多个(通常是三个)副本存储在不同的节点上。这种冗余存储机制确保了即使某个节点或副本发生故障,数据仍然可以从其他副本中恢复,从而保证了数据的高可靠性。
◦HDFS 架构
HDFS 采用了主从架构,包括一个 NameNode 和多个 DataNode。NameNode 负责管理文件系统的命名空间和元数据信息,而 DataNode 负责存储实际的数据块。
◦读取文件的过程:
1.客户端向 NameNode 请求获取文件,并对请求进行检查。
2.如果请求检查通过,NameNode 将查询元数据,向客户端返回文件所在的各个 Block 的 DN 地址。
3.客户端拿到 DN 列表之后,按照 Block,根据负载规则请求一台服务器,建立通道读取数据。
4.DN 接收到请求后,向客户端传输 Block 内容。
5.获取到的内容,存入本地缓存,然后写入到输出目标中。

3.2.2 分布式计算框架(MapReduce)
MapReduce 是 Hadoop 的分布式计算框架,用于在大规模数据集上执行并行计算任务。它将计算任务分解为多个独立的子任务,然后在集群中的多台计算节点上并行执行这些子任务。MapReduce 包括 Map 阶段和 Reduce 阶段 ,2 个阶段。
◦Map 阶段将原始数据分解为更小的数据单元,这些单元可以被并行处理,且彼此之间没有太多依赖。
◦Reduce 阶段则对 Map 阶段生成的中间结果进行汇总,以得到最终的处理结果。

4、Hive 工作流程
Hive 是一个建立在 Hadoop 之上的数据仓库系统,它提供了类似于 SQL 的查询语言(HiveQL),使用户可以在大规模数据集上执行查询和分析操作。下面是 Hive 的工作流程:
1.解析 HiveSQL:
◦当用户提交一个 HiveSQL 查询时,Hive 的解析器首先会解析这个查询,将其转换成一个抽象语法树(AST)。
◦解析器会检查 SQL 语法的正确性,并将 SQL 语句的各个部分(如 SELECT、FROM、WHERE 等)转换为相应的内部表示。
2.语义分析:
◦语义分析阶段会检查查询的语义正确性,确保所有引用的表、列和函数都存在且有效。
◦在这个阶段,Hive 还会获取表的元数据,如列的数据类型、表的分区信息等,为后续的计划生成做准备。
3.生成逻辑执行计划:
◦接下来,Hive 会根据解析和语义分析的结果,生成一个逻辑执行计划。这个计划描述了查询的执行步骤,但不涉及具体的物理操作。
◦逻辑计划通常包括一系列的操作,如扫描表、过滤数据、聚合数据等。
4.逻辑计划优化:
◦在生成逻辑计划后,Hive 会对其进行优化,以提高查询的执行效率。
◦优化可能包括重写查询、消除冗余操作、选择更有效的连接策略等。
5.生成物理执行计划:
◦优化后的逻辑计划会被转换为物理执行计划。物理计划描述了如何在 Hadoop 集群上实际执行查询。
◦在这个阶段,Hive 会决定将哪些操作映射到 MapReduce 任务上,以及如何在集群中分配这些任务。
6.执行 MapReduce 任务:
◦根据物理执行计划,Hive 会启动 MapReduce 任务来执行查询。任务读取的数据来自 HDFS。
◦Map 阶段通常负责读取数据并进行一些基本的处理,如过滤和转换。
◦Reduce 阶段则负责聚合数据并生成最终结果。
7.返回结果:
◦当所有 MapReduce 任务完成后,Hive 会收集并整理结果,然后将其返回给用户。

版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/f02a6db6f8c83c120f1eb07ca】。文章转载请联系作者。
评论