什么是Hive? Archi结构与模式

⚡ 智能摘要

Hive 是 Hadoop 生态系统的 SQL 层,它将 HiveQL 语句转换为分布式作业,读取 HDFS 上已有的结构化数据,因此分析师无需自己编写 MapReduce 代码即可查询 PB 级表。

  • 🐝 它是什么: 一款 ETL 和数据仓库工具,可在 HDFS 中存储的文件之上添加表、行和列。
  • 🗂️ 元数据存储: 模式信息存储在关系型元数据存储中,由 Derby 为单个用户提供支持,并由……提供支持。 MySQL 用于共享访问。
  • ???? 针对关系数据库管理系统: Hive 在读取时验证模式,可水平扩展,并且更倾向于执行大范围扫描而不是数据库处理的行级更新。
  • ????️ 三层: 客户端、服务和存储构成了架构,驱动程序协调编译器、元数据存储和执行引擎。
  • 🔀 两种模式: 本地模式适用于单个数据节点和小文件,而 MapReduce 模式将执行分散到多节点集群中。
  • ???? HiveServer2: 基于 Thrift 的 HS2 接口为远程会话增加了多客户端并发和身份验证功能。

蜂巢架构和模式

什么是Hive?

Hive 是一款基于 Hadoop 分布式文件系统 (HDFS) 开发的 ETL 和数据仓库工具。Hive 使执行以下操作变得轻松便捷:

  • 数据封装
  • 临时查询
  • 海量数据集分析

Hive 的重要特性

以下几点解释了 Hive 与普通 MapReduce 程序的区别。

  • 在 Hive 中,首先创建表和数据库,然后将数据加载到这些表中。
  • Hive 是一个数据仓库,专门用于管理和查询存储在表中的结构化数据。
  • 在处理结构化数据时,MapReduce 不像 Hive 框架那样具备用户自定义函数 (UDF) 等优化和易用性功能。查询优化指的是在性能方面提高查询执行效率的方法。
  • Hive 的语言借鉴了 SQL 的原理,使用户无需面对 MapReduce 编程的复杂性。它重用了关系数据库领域中常见的概念,例如表、行、列和模式,从而简化了学习过程。
  • Hadoop 的编程是基于平面文件的。因此,Hive 可以使用目录结构。 “分割” 提供数据以提升某些查询的性能。
  • Hive 的一个重要组成部分是元数据存储(metastore),用于存储模式信息。该元数据存储通常位于关系数据库中。我们可以使用诸如以下方法与 Hive 进行交互:
    • Web图形用户界面
    • Java 数据库连接 (JDBC) 接口
  • 大多数交互往往通过命令行界面 (CLI) 进行。Hive 提供了一个 CLI,用于使用 Hive 查询语言 (HQL) 编写 Hive 查询。
  • 通常,HQL 语法类似于 SQL 这是大多数数据分析师都熟悉的语法。下面的示例查询显示了指定表名中的所有记录。
    • 示例查询 :选择 * 来自
  • Hive 支持四种文件格式,分别是: TEXTFILE、SEQUENCEFILE、ORC 和 RCFILE (记录柱状文件)。
  • 对于单用户元数据存储,Hive 使用 Derby 数据库;对于多用户或共享元数据,Hive 使用 MySQL.

用于设置 MySQL 作为数据库并存储元数据信息,请查看相关教程。 使用以下方式配置 Hive 元数据存储 MySQL紧随其后的是 Hive 安装指南.

关于 Hive 的一些要点:

  • HQL 和 SQL 的主要区别在于,Hive 查询是在 Hadoop 的基础设施上执行,而不是在传统的数据库上执行。
  • Hive 查询执行是一系列自动生成的操作。 映射简化 工作。
  • Hive 支持分区和存储桶的概念,以便在客户端执行查询时轻松检索数据。
  • Hive 支持自定义 用户自定义函数 (UDF) 用于数据清洗、过滤及类似工作。根据程序员的需求,可以定义 Hive 用户自定义函数 (UDF)。

Hive 与关系数据库

Hive 能执行关系型数据库无法实现的功能。当数据量达到 PB 级时,秒级返回结果至关重要,而 Hive 正好能高效地做到这一点。主要区别如下。

关系型数据库是 “读取模式和写入模式”首先创建表,然后将数据插入该表。在关系数据库表中,可以执行插入、更新和修改等操作。

Hive是 “只读模式”因此,更新和修改等功能在早期版本中无法正常工作,因为典型的集群中的 Hive 查询会跨多个数据节点运行,这使得跨多个节点更新和修改数据成为不可能(Hive 版本低于 0.13)。

Hive 也支持 “博览群书,精辟写作” 模式,因此在最近的版本中,可以在插入后更新表格。

注意: 新版本的 Hive 都包含更新的功能。Hive 0.14 引入了 UPDATE 和 DELETE 这两个新功能,后续版本则增加了对 ACID 事务的完整支持。

下表对对比结果进行了简化。

方面 关系型数据库 阿帕奇蜂巢
模式验证 写入 已读
典型数据量 千兆字节到太字节 从太字节到拍字节
工作量 行级 OLTP 读取和写入 全扫描批量分析
查询语言 SQL HQL,一种受 SQL 启发的方言
执行 数据库引擎 分布式集群作业

蜂房 Archi质地

下图解释了 Apache (阿帕奇) Hive架构详解。

Apache Hive架构图,展示了客户端、服务、存储和计算。

Hive主要由3个核心部分组成:

  1. Hive 客户端
  2. Hive 服务
  3. Hive 存储和计算

Hive 客户端

Hive 为与不同类型的应用程序通信提供了不同的驱动程序。对于基于 Thrift 的应用程序,它提供了一个 Thrift 客户端用于通信。

对于 Java 对于相关应用程序,它提供 JDBC 驱动程序。对于其他类型的应用程序,它提供 ODBC 驱动程序。这些客户端和驱动程序反过来又通过 Hive 服务与 Hive 服务器通信。

蜂巢服务

客户端与 Hive 的交互是通过 Hive 服务进行的。如果客户端想要在 Hive 中执行任何与查询相关的操作,它必须通过 Hive 服务进行通信。

CLI 作为 Hive 服务处理 DDL 操作。所有驱动程序都与 Hive 服务器和 Hive 服务中的主驱动程序通信,如上图所示。

Hive 服务中的驱动程序是主要驱动程序:它与 JDBC、ODBC 和其他特定于客户端的应用程序通信,然后将它们的请求传递给元数据存储和文件系统进行进一步处理。

Hive 存储和计算

Hive 服务(例如元数据存储、文件系统和作业客户端)会与 Hive 存储进行通信,并执行以下操作:

作业执行流程

下图 trac这是从用户界面到数据节点再返回的一次查询。

Hive作业执行流程图 trac从用户界面向数据节点发出查询

从上图我们可以看出Hive在Hadoop环境下的作业执行流程。Hive中的数据流遵循以下模式。

  1. 通过用户界面执行查询
  2. 驱动程序与编译器交互以获取执行计划。(这里的执行计划指的是查询执行过程及其相关的元数据信息收集。)
  3. 编译器生成待执行作业的计划。编译器与元数据存储库通信以获取元数据请求。
  4. 元数据存储库将元数据信息发送回编译器。
  5. 编译器会将拟定的查询执行计划传递给驱动程序。
  6. 驱动程序将执行计划发送到执行引擎。
  7. 执行引擎(EE)充当 Hive 和 Hadoop 之间的桥梁,用于处理查询,包括 DFS 操作:
    • EE 首先联系名称节点,然后联系数据节点,以获取存储在表中的值。
    • EE 从数据节点获取所需的记录。实际的表数据仅存储在数据节点上;它仅从名称节点获取查询所需的元数据。
    • 它从与所述查询相关的数据节点收集实际数据。
    • EE 与元数据存储进行双向通信,以执行 DDL(数据定义语言)操作,例如: 创建、删除和修改 关于表和数据库。元数据存储仅存储数据库名、表名和列名。
    • EE 进而与 Hadoop 守护进程(例如 NameNode、DataNode 和作业节点)进行通信。 tracker 用于在 Hadoop 文件系统之上执行查询
  1. 正在从驱动程序获取结果
  2. 将结果发送到执行引擎。执行引擎从数据节点获取结果后,会将结果发送回驱动程序和用户界面(前端)。

Hive 通过执行引擎与 Hadoop 文件系统及其守护进程保持联系。图中虚线箭头表示这种通信。

Hive 的不同模式

Hive可以根据Hadoop数据节点的大小,以两种模式运行。这两种模式是:

  • 本地模式
  • MapReduce模式

何时使用本地模式

  • 如果 Hadoop 以伪分布式模式安装,只有一个数据节点,则在这种模式下我们使用 Hive。
  • 如果数据量足够小,可以限制在单台本地计算机上,我们可以使用这种模式。
  • 本地机器上较小的数据集的处理速度非常快

何时使用 MapReduce 模式

  • 如果 Hadoop 有多个数据节点,并且数据分布在不同的节点上,那么在这种模式下我们使用 Hive。
  • 它能够处理大量数据,并且查询是并行执行的。
  • 通过该模式可以实现对大数据集更好的性能处理

在 Hive 中,我们可以设置一个属性来指定 Hive 的工作模式。默认情况下,它以 MapReduce 模式运行;对于本地模式,您可以使用以下设置:

SET mapred.job.tracker=local;

从 Hive 0.7 版本开始,它支持一种模式,可以自动在本地模式下运行 MapReduce 作业。在 Hive 4.x 中,默认引擎是 Apache Tez,因此该特性适用于旧版 MapReduce 路径。

什么是 Hive Server2 (HS2)?

HiveServer2 (HS2) 是一个服务器接口,它执行以下功能:

  • 允许远程客户端针对 Hive 执行查询
  • 检索这些查询的结果

当前版本增加了基于 Thrift RPC 的高级功能,例如:

  • 多客户端并发
  • 认证

HS2 位于 Beeline 和所有 JDBC 或 ODBC 会话的底层,这就是它取代单用户 Hive CLI 的原因。 HiveQL 操作符和内置函数 参考文献是顺理成章的下一步。

常见问题

Hive 是一个批量查询层,它通过分布式作业扫描大型表。HBase 是一个 NoSQL 数据库,专为对单行数据进行毫秒级随机读写而构建。它们解决的是截然相反的访问模式,因此经常并行运行。

Hive 运行在 MapReduce、Apache Tez 或 Apache 上。 SparkMapReduce 已被弃用,Hive 4.x 默认使用 Tez,Tez 将中间结果保存在内存中,而不是在阶段之间将其写入磁盘。

托管表赋予 Hive 对元数据和文件的所有权,因此请删除ping 它会从仓库目录中删除数据。外部表仅存储元数据,并执行删除操作。ping 它不会触及底层文件。

学习到的成本模型会将执行统计数据反馈给规划器,从而比静态估计更准确地预测扫描量、连接顺序和分区修剪。云平台也会提供相同的信号,作为压缩和分区布局建议。

Copilot 可以编写 HiveQL 连接、窗口函数等脚本。 Java 根据注释创建的用户自定义函数 (UDF) 框架,可以减少样板代码。列名、分区键和数据类型仍需先与实际的元数据存储进行核对。

是的。Hive 0.14 添加了 UPDATE 和 DELETE 语句,后续版本则为事务表提供了完整的 ACID 支持。Hive 4.x 通过 Apache Iceberg 表扩展了这一功能,实现了快照隔离和模式演化。

这三者都通过相同的文件公开 SQL。Hive 更适合长时间批处理作业,并且拥有其他两项读取的元数据存储。 Spark SQL 适用于混合管道;Trino 则针对跨多个数据源的交互式查询。

是的,这主要通过 Hive Metastore 实现,它仍然是目录标准。 SparkTrino、Presto 和 Flink 都支持读取操作。Hive 本身仍然负责计划的批量转换和仓库加载。

总结一下这篇文章: