Hive Metastore Server (HMS)

Hive架构

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

UI——用户向系统提交查询和其他操作的用户界面。截至 2011 年,该系统具有命令行界面,并且正在开发基于 Web 的 GUI。

驱动程序——接收查询的组件。该组件实现了会话句柄的概念,并提供了以 JDBC/ODBC 接口为模型的执行和获取 API。

编译器——解析查询的组件,对不同的查询块和查询表达式进行语义分析,并最终在从 Metastore 中查找的表和分区元数据的帮助下生成执行计划。

Metastore – 存储仓库中各种表和分区的所有结构信息的组件,包括列和列类型信息,读写数据所需的序列化器和反序列化器以及存储数据的相应HDFS文件。

执行引擎——执行编译器创建的执行计划的组件。该计划是阶段的 DAG。执行引擎管理计划的这些不同阶段之间的依赖关系,并在适当的系统组件上执行这些阶段。

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

Hive 中的数据组织为:

表(table)——这些类似于关系数据库中的表。可以过滤、投影、连接和合并表格。此外,表的所有数据都存储在 HDFS 的一个目录中。 Hive 还支持外部表的概念,其中可以通过为表创建 DDL 提供适当的位置来在 HDFS 中预先存在的文件或目录上创建表。表中的行被组织成类似于关系数据库的类型化列。

分区(partition)——每个表都可以有一个或多个分区键来确定数据的存储方式,例如,具有日期分区列 ds 的表 T 具有包含特定日期数据的文件,这些文件存储在 <table location>/ds=<date > HDFS 中的目录。分区允许系统根据查询谓词修剪要检查的数据,例如,对 T 中满足谓词 T.ds = '2008-09-01' 的行感兴趣的查询只需要查看 <表位置>/ds=2008-09-01/ HDFS 中的目录。

Buckets——每个分区中的数据可以根据表中列的哈希值依次划分到 Buckets 中。每个桶都作为一个文件存储在分区目录中。 Bucketing 允许系统有效地评估依赖于数据样本的查询(这些是在表上使用 SAMPLE 子句的查询)。

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

元存储(Metastore)

动机(motivation)

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

元数据对象(Metadata Objects

数据库——是表的命名空间。以后可以作为行政单位使用。数据库“默认”用于没有用户提供的数据库名称的表。

表——表的元数据包含列列表、所有者、存储和 SerDe 信息。它还可以包含任何用户提供的键和值数据。存储信息包括底层数据的位置、文件输入输出格式和分桶信息。 SerDe 元数据包括序列化器和反序列化器的实现类以及实现所需的任何支持信息。所有这些信息都可以在创建表的过程中提供。

分区——每个分区都可以有自己的列和 SerDe 以及存储信息。这有助于在不影响旧分区的情况下更改架构。

元数据存储架构(Metastore Architecture)

Metastore 是一个带有数据库或文件支持存储的对象存储。数据库支持的存储是使用称为 DataNucleus 的对象关系映射 (ORM) 解决方案实现的。将其存储在关系数据库中的主要动机是元数据的可查询性。为元数据使用单独的数据存储而不是使用 HDFS 的一些缺点是同步和可扩展性问题。此外,由于缺乏对文件的随机更新,没有明确的方法在 HDFS 之上实现对象存储。这与关系存储的可查询性优势相结合,使我们的方法成为明智的方法。

Metastore 可以配置为以两种方式使用:远程和嵌入式。在远程模式下,Metastore 是一个 Thrift 服务。此模式对非 Java 客户端很有用。在嵌入式模式下,Hive 客户端使用 JDBC 直接连接到底层 Metastore。这种模式很有用,因为它避免了需要维护和监视的另一个系统。这两种模式可以共存。 (更新:本地 Metastore 是第三种可能性。有关详细信息,请参阅 Hive Metastore Administration。)

元数据存储接口(Metastore Interface)

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

Hive查询语言(Hive Query Language

HiveQL 是一种类似 SQL 的 Hive 查询语言。它主要模仿 SQL 语法来创建表、将数据加载到表中和查询表。 HiveQL 还允许用户嵌入他们的自定义 map-reduce 脚本。这些脚本可以使用简单的基于行的流接口以任何语言编写——从标准输入读取行并将行写出到标准输出。这种灵活性是以将行与字符串相互转换而导致的性能损失为代价的。然而,我们已经看到用户并不介意这一点,因为他们可以用他们选择的语言来实现他们的脚本。 HiveQL 的另一个独有特性是多表插入。在此构造中,用户可以使用单个 HiveQL 查询对相同的输入数据执行多个查询。 Hive 优化这些查询以共享输入数据的扫描,从而将这些查询的吞吐量提高几个数量级。由于空间不足,我们省略了更多细节。有关 HiveQL 语言的更完整描述,请参阅语言手册。

编译器(Compiler)

解析器——将查询字符串转换为解析树表示。

语义分析器——将解析树转换为内部查询表示,它仍然是基于块的,而不是运算符树。作为此步骤的一部分,将验证列名并执行 * 等扩展。类型检查和任何隐式类型转换也在此阶段执行。如果正在考虑的表是分区表,这是常见的情况,则收集该表的所有表达式,以便以后可以使用它们来修剪不需要的分区。如果查询指定了抽样,那么也会收集该抽样以备后用。

逻辑计划生成器——将内部查询表示转换为逻辑计划,它由一棵运算符树组成。一些运算符是关系代数运算符,如“filter”、“join”等。但是一些运算符是特定于 Hive 的,稍后用于将此计划转换为一系列 map-reduce 作业。一种这样的运算符是 reduceSink 运算符,它出现在 map-reduce 边界。此步骤还包括优化器转换计划以提高性能——其中一些转换包括:将一系列连接转换为单个多路连接、为 group-by 执行映射端部分聚合、执行 group-通过分 2 个阶段来避免单个 reducer 在分组键存在倾斜数据时成为瓶颈的情况。每个运算符都包含一个描述符,它是一个可序列化的对象。

查询计划生成器——将逻辑计划转换为一系列 map-reduce 任务。运算符树被递归遍历,分解为一系列 map-reduce 可序列化任务,这些任务稍后可以提交给 Hadoop 分布式文件系统的 map-reduce 框架。 reduceSink 运算符是 map-reduce 边界,其描述符包含归约键。 reduceSink 描述符中的归约键被用作 map-reduce 边界中的归约键。该计划包含所需的样本/分区(如果查询如此指定)。该计划被序列化并写入文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值