hive metastore介绍
hive metastore介绍
参考地址:https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+3.0+Administration
Metastore 提供了数据仓库的两个重要但经常被忽视的功能:数据抽象和数据发现。 如果没有 Hive 中提供的数据抽象,用户必须在查询时提供有关数据格式、提取器和加载器的信息。 在 Hive 中,此信息在表创建期间提供,并在每次引用表时重复使用。 这与传统的仓储系统非常相似。 第二个功能,数据发现,使用户能够发现和探索仓库中的相关和特定数据。 可以使用此元数据构建其他工具,以公开并可能增强有关数据及其可用性的信息。 Hive 通过提供与 Hive 查询处理系统紧密集成的元数据存储库来实现这两个功能,以便数据和元数据同步。
元数据对象
数据库 – 是表的命名空间。 以后可以作为行政单位使用。 数据库 'default' 用于没有用户提供的数据库名称的表。
表 – 表的元数据包含列、所有者、存储和 SerDe 信息的列表。 它还可以包含任何用户提供的键和值数据。 存储信息包括底层数据的位置、文件输入输出格式和分桶信息。 SerDe 元数据包括序列化器和反序列化器的实现类以及实现所需的任何支持信息。 所有这些信息都可以在创建表的过程中提供。
分区 - 每个分区都可以有自己的列、SerDe 和存储信息。 这有助于架构更改而不影响旧分区。
元数据架构
Metastore 是一个对象存储,带有数据库或文件支持的存储。 数据库支持的存储是使用称为 DataNucleus 的对象关系映射 (ORM) 解决方案实现的。 将其存储在关系数据库中的主要动机是元数据的可查询性。 为元数据使用单独的数据存储而不是使用 HDFS 的一些缺点是同步和可伸缩性问题。 此外,由于缺少对文件的随机更新,因此没有明确的方法在 HDFS 之上实现对象存储。 这一点,再加上关系存储的可查询性优势,使我们的方法成为一种明智的方法。
Metastore 可以配置为以两种方式使用:远程和嵌入式。 在远程模式下,Metastore 是一个 Thrift 服务。 此模式对非 Java 客户端很有用。 在嵌入式模式下,Hive 客户端使用 JDBC 直接连接到底层 Metastore。 这种模式很有用,因为它避免了另一个需要维护和监控的系统。 这两种模式可以共存。 (更新:本地 Metastore 是第三种可能性。有关详细信息,请参阅 Hive Metastore 管理。)
元数据接口
Metastore 提供了一个 Thrift 接口来操作和查询 Hive 元数据。 Thrift 提供了许多流行语言的绑定。 第三方工具可以使用此接口将 Hive 元数据集成到其他业务元数据存储库中。
Hive查询语言
HiveQL 是一种类似 SQL 的 Hive 查询语言。它主要模仿 SQL 语法来创建表、将数据加载到表中并查询表。 HiveQL 还允许用户嵌入他们的自定义 map-reduce 脚本。这些脚本可以使用简单的基于行的流接口以任何语言编写——从标准输入读取行并将行写出到标准输出。这种灵活性的代价是将行从字符串转换为字符串,从而导致性能下降。但是,我们已经看到用户并不介意这一点,因为他们可以用他们选择的语言实现他们的脚本。 HiveQL 独有的另一个特性是多表插入。在此构造中,用户可以使用单个 HiveQL 查询对同一输入数据执行多个查询。 Hive 优化这些查询以共享输入数据的扫描,从而将这些查询的吞吐量提高几个数量级。由于篇幅有限,我们省略了更多细节。有关 HiveQL 语言的更完整描述,请参阅语言手册。
Compiler
解析器——将查询字符串转换为解析树表示。
语义分析器——将解析树转换为内部查询表示,它仍然是基于块的而不是运算符树。作为此步骤的一部分,将验证列名称并执行 * 等扩展。在此阶段还执行类型检查和任何隐式类型转换。如果考虑中的表是分区表,这是常见的情况,则收集该表的所有表达式,以便以后可以使用它们来修剪不需要的分区。如果查询已指定采样,则也会收集该采样以供稍后使用。
逻辑计划生成器 - 将内部查询表示转换为逻辑计划,该逻辑计划由运算符树组成。一些运算符是关系代数运算符,如“过滤器”、“连接”等。但有些运算符是 Hive 特定的,稍后用于将此计划转换为一系列 map-reduce 作业。一个这样的操作符是一个 reduceSink 操作符,它出现在 map-reduce 边界。这一步还包括优化器来转换计划以提高性能——其中一些转换包括:将一系列连接转换为单个多路连接,为 group-by 执行 map 端部分聚合,执行 group-分 2 个阶段,以避免出现单个减速器可能成为分组键存在倾斜数据的瓶颈的情况。每个操作符都包含一个描述符,它是一个可序列化的对象。
查询计划生成器——将逻辑计划转换为一系列 map-reduce 任务。运算符树被递归遍历,分解成一系列可序列化的 map-reduce 任务,这些任务稍后可以提交给 Hadoop 分布式文件系统的 map-reduce 框架。 reduceSink 操作符是 map-reduce 边界,其描述符包含缩减键。 reduceSink 描述符中的归约键用作 map-reduce 边界中的归约键。如果查询如此指定,则计划由所需的样本/分区组成。该计划被序列化并写入文件。
Optimizer
更多的计划转换由优化器执行。 优化器是一个不断发展的组件。 截至 2011 年,它基于规则并执行以下操作:列修剪和谓词下推。 然而,基础设施已经到位,并且正在进行包括地图端连接等其他优化的工作。 (Hive 0.11 添加了几个连接优化。)
优化器可以增强为基于成本的(请参阅 Hive 和 HIVE-5775 中的基于成本的优化)。 输出表的排序特性也可以保留下来,稍后使用以生成更好的计划。 可以对小样本数据执行查询以猜测数据分布,从而可以生成更好的计划。
服务
Hive Metastore (HMS) 是一种服务,用于在后端 RDBMS(例如 MySQL 或 PostgreSQL)中存储与 Apache Hive 和其他服务相关的元数据。 Impala、Spark、Hive 和其他服务共享元存储。 与 HMS 的连接包括 HiveServer、Ranger 和代表 HDFS 的 NameNode。
Beeline、Hue、JDBC 和 Impala shell 客户端通过 thrift 或 JDBC 向 HiveServer 发出请求。 HiveServer 实例向 HMS 读取/写入数据。 默认情况下,冗余 HMS 以主动/主动模式运行。 物理数据驻留在后端 RDBMS 中,其中一个用于 HMS。 您必须将所有 HMS 实例配置为使用相同的后端数据库。 一个单独的 RDBMS 支持安全服务,例如 Ranger。 在任何给定时间,所有连接都路由到单个 RDBMS 服务。 HMS 通过 thrift 与 NameNode 通信,并充当 HDFS 的客户端。
HMS 直接连接到 Ranger 和 NameNode (HDFS),HiveServer 也是如此,但为简单起见,图中未显示。 后端的一个或多个 HMS 实例可以与其他服务通信,例如 Ranger。