Design

此页面包含有关 Hive 设计和体系结构的详细信息。有关 Hive 的简要技术报告可在hive.pdf获得。

Figure 1

Hive Architecture

图 1 显示了 Hive 的主要组件及其与 Hadoop 的交互。如图所示,Hive 的主要组件是:

图 1 还显示了典型查询如何在系统中流动。 UI 调用驱动程序的执行接口(图 1 中的步骤 1)。驱动程序为查询创建会话句柄,并将查询发送给编译器以生成执行计划(步骤 2)。编译器从元存储中获取必要的元数据(步骤 3 和 4)。该元数据用于对查询树中的表达式进行类型检查,以及根据查询谓词修剪分区。编译器生成的计划(步骤 5)是阶段的 DAG,每个阶段都是 Map/归约作业,元数据操作或 HDFS 上的操作。对于 map/reduce 阶段,该计划包含 Map 运算符树(在 Map 器上执行的运算符树)和 reduce 运算符树(对于需要 reducers 的运算)。执行引擎将这些阶段提交给适当的组件(步骤 6、6.1、6.2 和 6.3)。在每个任务(Map 器/化简器)中,与表或中间输出关联的解串器用于从 HDFS 文件读取行,并将这些行通过关联的运算符树传递。生成输出后,将通过序列化器将其写入临时 HDFS 文件中(如果不需要减少操作,则在 Map 器中发生)。临时文件用于向计划的后续 Map/缩小阶段提供数据。对于 DML 操作,最终的临时文件将移动到表的位置。此方案用于确保不读取脏数据(文件重命名是 HDFS 中的原子操作)。对于查询,执行引擎直接从 HDFS 读取临时文件的内容,作为驱动程序获取调用的一部分(步骤 7、8 和 9)。

Hive 数据模型

Hive 中的数据组织为:

除了原始列类型(整数,浮点数,通用字符串,日期和布尔值)之外,Hive 还支持数组和 Map。此外,用户可以从任何基元,集合或其他用户定义的类型中以编程方式组合自己的类型。typing 系统与 SerDe(序列化/反序列化)和对象检查器接口紧密相关。用户可以通过实现自己的对象检查器来创建自己的类型,并使用这些对象检查器来创建自己的 SerDes 以将其数据序列化和反序列化为 HDFS 文件。当了解其他数据格式和更丰富的类型时,这两个接口提供了必要的钩子,以扩展 Hive 的功能。诸如 ListObjectInspector,StructObjectInspector 和 MapObjectInspector 之类的内置对象检查器提供了必要的 Primitives,以可扩展的方式组成更丰富的类型。对于 Map(关联数组)和数组,提供了有用的内置函数,例如大小和索引运算符。点分符号用于导航嵌套类型,例如 a.b.c = 1 查看类型 a 的字段 b 的字段 c 并将其与 1 进行比较。

Metastore

Motivation

Metastore 提供了数据仓库的两个重要但经常被忽略的功能:数据抽象和数据发现。没有 Hive 中提供的数据抽象,用户必须提供有关数据格式,提取器和加载器的信息以及查询。在 Hive 中,此信息在表创建期间给出,并在每次引用表时重新使用。这与传统的仓储系统非常相似。第二种功能是数据发现,使用户能够发现和探索仓库中的相关数据和特定数据。可以使用此元数据构建其他工具,以公开并可能增强有关数据及其可用性的信息。 Hive 通过提供与 Hive 查询处理系统紧密集成的元数据存储库来实现这两个功能,从而使数据和元数据同步。

Metadata Objects

Metastore Architecture

Metastore 是具有数据库或文件支持存储的对象存储。数据库支持的存储是使用称为DataNucleus的对象关系 Map(ORM)解决方案实现的。将其存储在关系数据库中的主要动机是元数据的可查询性。使用单独的数据存储存储元数据而不使用 HDFS 的一些缺点是同步和可伸缩性问题。另外,由于缺乏对文件的随机更新,因此没有明确的方法在 HDFS 之上实现对象存储。这再加上关系存储的可查询性的优点,使我们的方法变得明智。

可以将元存储库配置为以多种方式使用:远程和嵌入式。在远程模式下,Metastore 是Thrift服务。此模式对于非 JavaClient 端很有用。在嵌入式模式下,HiveClient 端使用 JDBC 直接连接到基础元存储。此模式很有用,因为它避免了需要维护和监视的另一个系统。这两种模式可以共存。 (更新:本地 metastore 是第三种可能性.有关详细信息,请参见Hive MetastoreManagement。)

Metastore Interface

Metastore 提供了Thrift interface来操纵和查询 Hive 元数据。 Thrift 提供许多流行语言的绑定。第三方工具可以使用此界面将 Hive 元数据集成到其他业务元数据存储库中。

Hive 查询语言

HiveQL 是 Hive 的一种类似 SQL 的查询语言。它主要模仿用于创建表,将数据加载到表和查询表的 SQL 语法。 HiveQL 还允许用户嵌入自定义的 map-reduce 脚本。可以使用简单的基于行的流接口以任何语言编写这些脚本-从标准 Importing 读取行,并将行写至标准输出。这种灵 Active 是以将行与字符串转换为结果而导致性能下降的代价为代价的。但是,我们看到用户不介意这一点,因为他们可以使用自己选择的语言来实现脚本。 HiveQL 独有的另一个功能是多表插入。在这种结构中,用户可以使用单个 HiveQL 查询对同一 Importing 数据执行多个查询。 Hive 优化了这些查询以共享 Importing 数据的扫描,从而将这些查询的吞吐量提高了几个数量级。由于篇幅所限,我们省略了更多细节。有关 HiveQL 语言的更完整说明,请参见language manual

Compiler

Optimizer

优化器将执行更多计划转换。优化器是一个不断 Developing 的组件。截至 2011 年,它是基于规则的,并执行以下操作:列修剪和谓词下推。但是,基础架构已经到位,并且正在进行包括其他优化(如 Map 侧联接)的工作。 (配置单元 0.11 添加了几个join optimizations。)

可以将优化器增强为基于成本的(请参阅Hive 中基于成本的优化HIVE-5775)。输出表的排序性质也可以保留,以后再用于生成更好的计划。可以对少量数据 samples 执行查询,以猜测数据分布,这可以用于生成更好的计划。

在 Hive 0.12 中添加了correlation optimizer

该计划是一个通用的运算符树,可以轻松地进行操作。

Hive APIs

Hive API 概述描述了 Hive 提供的各种面向公众的 API。

首页