CDP的Hive3系列之Hive Metastore介绍

这是CDP中Apache Hive3用户指南系列之一,之后还有几篇来介绍Hive3的功能和使用。

Hive Metastore (HMS) 是一种服务,用于在后端 RDBMS(例如 MySQL PostgreSQL)中存储与 Apache Hive 和其他服务相关的元数据。ImpalaSparkHive 和其他服务共享元存储。与 HMS 的连接包括 HiveServerRanger 和代表 HDFS NameNode

BeelineHueJDBC Impala shell客户端通过 thrift JDBC HiveServer 发出请求。HiveServer 实例向 HMS /写数据。默认情况下,冗余的 HMS 以主动/主动模式运行。物理数据驻留在后端 RDBMS 中,一个用于 HMSRDBMS。所有的 HMS 实例使用相同的后端数据库。一个单独的 RDBMS 支持安全服务,例如 Ranger。在任何给定时间,所有连接都路由到单一的 RDBMS 服务。HMS 通过thrift与 NameNode 对话,并充当 HDFS 的客户端。

CDP的Hive3系列之Hive Metastore介绍

HMS 直接连接到 Ranger NameNode (HDFS)HiveServer 也是如此,但为简单起见,该图中并未显示。后端的一个或多个 HMS 实例可以与其他服务(例如 Ranger)通信。

原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/hive-hms-overview/topics/hive-hms-introduction.html

1 HMS表的存储

当您运行 CREATE TABLE 语句或将表迁移到 Cloudera Data Platform 时,您需要了解 HMS 如何存储 Hive 表。语句的成功或失败、结果表类型和表位置取决于许多因素。

1.1 HMS 表的转换

HMS 包含有关您创建的表的以下Hive 元数据:

·      表的定义

·      列名

·      数据类型

·      *的Schema存储库中的注释

当您在 CREATE TABLE 语句中使用 EXTERNAL 关键字时,HMS 会将表存储为外部表。当您省略 EXTERNAL关键字并创建托管表或摄取托管表时,HMS 可能会将表转换为外部表,或者创建表可能会失败,这具体取决于表的属性。影响表转换的一个重要表属性是 ACID 或非 ACID 表类型:

非ACID

表属性不包含任何设置为 true 的 ACID 相关属性。例如,该表不包含这样的属性 transactional=true 或 insert_only=true

ACID

表属性确实包含一个或多个设置为true 的 ACID 属性。

完全的ACID

表属性包含 transactional=true 但包含insert_only=true

仅插入的 ACID

表属性包含 insert_only=true。

以下矩阵显示了表类型以及是否支持位置属性。

ACID

托管表

位置属性

注释

行动

ACID

是的

是的

迁移到 CDP,例如从 HDP CDH 集群。

表存储为外部

ACID

是的

表位置为空(null)

存储在外部仓库子目录中的表*

metastore.warehouse.external.dir

HMS 检测与 HMS 交互的客户端类型,例如Hive 或 Spark,并将客户端的能力与表的需求进行比较。HMS 根据比较结果执行以下操作:

表要求

客户符合要求

托管表

ACID 表类型

行动

客户端可以写入任何类型的 ACID

是的

是的

创建表失败

客户端可以写入完整的 ACID

是的

insert_only=true

创建表失败

客户端可以写入仅插入的 ACID

是的

insert_only=true

创建表失败

例如,如果 Spark 客户端不具备所需的功能,则会出现以下类型的错误消息:

Spark has no access to table `mytable`. Clients can access this table only if
they have the following capabilities: CONNECTORREAD,HIVEFULLACIDREAD, HIVEFULLACIDWRITE,
HIVEMANAGESTATS, HIVECACHEINVALIDATE, . . .

2 配置 HMS 以实现高可用性

要在主实例出现故障时提供到辅助 Hive Metastore 的故障转移,您需要知道如何在 Cloudera Manager 中添加 Metastore 角色并配置属性。

多个 HMS 实例以主动/主动模式运行。不发生负载平衡。HMS 客户端总是命中第一个实例,除非它关闭。在这种情况下,客户端会扫描hive.metastore.uris属性,该属性列出HMS 实例列表以查找可用于替换的 HMS。如果hive.metastore.uri.selection设置为SEQUENTIAL(推荐和默认),则第二个 HMS 是指定替换 ;否则,如果hive.metastore.uri.selection设置为RANDOM,则从列表中随机选择替换 

最低要求角色: 配置者(也由集群管理员、完全管理员提供

1.    Cloudera Manager 中,单击集群> Hive >配置

2.   采取以下措施之一

o   如果您有一个由 Kerberos 保护的集群,请搜索 Hive 委托令牌存储,它指定 Kerberos 令牌的存储,如下所述

o   如果您有一个不安全的集群,请跳过下一步

3.   选择org.apache.hadoop.hive.thrift.DBTokenStore,然后保存更改

CDP的Hive3系列之Hive Metastore介绍

Kerberos 委托令牌的存储由 hive.cluster.delegation.token.store.class属性定义。可用的选择是 ZookeeperMetastore 和内存。Cloudera 建议通过设置org.apache.hadoop.hive.thrift.DBTokenStore 属性来使用数据库

4.   单击实例>操作>添加角色实

CDP的Hive3系列之Hive Metastore介绍

5.   在分配角色中,在 Metastore 服务器中,单击选择主机

6.    Hosts Selected 中,滚动并选择要用作备份Metastore 的主机,然后单击OK

7.   单击继续,直到退出向导

8.   操作菜单启动主机上的Metastore 角色

hive.metastore.uris属性会自动更新

9.   要检查或更改hive.metastore.uri.selection 属性,请转到Clusters > Hive > Configurations,然后搜索Hive Service Advanced Configuration Snippet (Safety Valve) for hive-site.xml

10.添加属性和值(SEQUENTIAL RANDOM

3 HWC授权

您配置 Hive 仓库连接器 (HWC) 的方式会影响查询授权过程和您的安全性。有多种方法可以通过 HWC 访问 Hive,并不是所有操作都通过 HiveServer (HS2)。一些操作,例如 Spark Direct Reader Hive Streaming,通过 HMS 直接进入 Hive,其中通常适用基于存储的权限。

作为客户端用户,您必须在使用HWC 之前使用 kerberos 登录。您需要适当的存储权限才能写入目标分区或表位置。您需要配置 HWC 读取选项。您需要配置 HWC 读取选项。HWC 读取配置选项如下表所示

能力

JDBC方式

Spark Direct Reader模式

Ranger 与细粒度访问控制的集成

不适用

Hive ACID 读取

处理的工作负载

非生产的工作负载、小数据集

生产工作负载,没有细粒度访问控制的 ETL

这些读取配置选项需要连接到不同的Hive 组件

·      Direct Reader 配置:连接到 Hive Metastore (HMS)

·      JDBC 配置:连接到 HiveServer (HS2) HiveServer Interactive (HSI)

Ranger 授权通过 HiveServer (HS2) Hive Metastore API (HMS API) Spark 访问 Hive

要将 ACID 托管表从 Spark 写入 Hive,您必须使用 HWC。要将外部表从 Spark 写入 Hive,您可以使用原生 Spark HWC

下图展示了典型的读授权流程

CDP的Hive3系列之Hive Metastore介绍

下图展示了典型的写授权流程

CDP的Hive3系列之Hive Metastore介绍

写入时,HWC 始终通过 HiveServer (HS2) 强制执行授权。在 JDBC 模式下读取托管表会强制实施 Ranger 授权,包括细粒度功能,例如字段映射。在 Direct Reader 模式下,Ranger HMS 的集成来提供授权

外部表查询通过 HMS API,它也与 Ranger 集成。如果您使用 HWC,则与 Ranger 集成的 Hive 元存储 (HMS) API 会授权外部表访问。在这种情况下,HMS API-Ranger 集成会强制执行 Ranger Hive ACL。使用 HWC 时,诸如 DROP TABLE 之类的查询会影响文件系统数据以及 HMS 中的元数据

使用 Direct Reader 选项,SparkSQL 查询直接从 HMS 读取托管表元数据,但前提是您有权访问文件系统上的文件。您不能使用 Direct Reader 选项写入托管表

3.1 托管表授

Spark 作业在尝试访问 Apache Hive 托管表时模拟最终用户。作为最终用户,您无权访问 Hive 仓库中的托管文件。托管表具有不允许最终用户访问的默认文件系统权限,包括 Spark 用户访问

作为管理员,当您为 JDBC 读取配置 HWC 时,您可以在 Ranger 中设置访问托管表的权限。您可以微调 Ranger 以保护特定数据。例如,您可以屏蔽某些列中的数据,或设置基于标签的访问控制

当您为 Direct Reader 模式配置 HWC 时,您不能以这种方式使用 Ranger。您必须为托管表设置对文件系统位置的读取访问权限。您必须对 Hive 仓库位置hive.metastore.warehouse.dir)具有读取和执行权限

3.2 外表授

支持外部表读写的 Ranger 授权。您需要在 Cloudera Manager 中配置一些属性来授权外部表写入。您必须被授予对外部表文件的文件系统权限,以允许 Spark 直接访问实际表数据,而不仅仅是表元数据

3.3 Direct Reader授权限制

由于 Spark 允许用户运行任意代码,因此 Spark 本身无法实现 Ranger 细粒度访问控制,例如行级过滤或列级屏蔽。此限制扩展到使用 Direct Reader 读取数据

要在细粒度级别限制数据访问,请使用支持 Ranger 的读取选项。如果不需要细粒度访问,请仅考虑使用 Direct Reader 选项从 Spark 读取 Hive 数据。例如,将 Direct Reader 用于 ETL 用例

授权外部

作为管理员,您需要了解如何授权用户对Apache Hive 外部表进行读写,包括使用Spark SQLHue Beeline 访问表。您还需要为用户配置表的文件级权限。

您为 HMS API-Ranger集成设置以下属性和值

hive.metastore.pre.event.listeners

org.apache.hadoop.hive.ql.security.authorization.plugin.metastore.HiveMetaStoreAuthorizer

配置 HMS 写入

hive.security.authenticator.manager

值: org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator

使用 Cloudera Manager 安全阀将属性添加到hive-site.xml

4.1  配置步骤

1.    Cloudera Manager 中,要配置Hive Metastore 属性,请单击Clusters > Hive-1 > Configuration

2.   搜索Hive-site

3.   hive-site.xml Hive Metastore 服务器高级配置片段(安全阀)中,单击+

CDP的Hive3系列之Hive Metastore介绍

4.   添加属性名称和值

5.   重复步骤以添加其他属性

6.   保存更改

7.   为用户配置表的文件级权限

只有对外部表具有文件级权限的用户才能访问外部表

配置HMS 属性以进行授

作为管理员,如果您对查询授权有任何问题,您可能需要通过 Ranger 设置 Apache Hive Metastore (HMS) 授权。比如你配置了Hive查询的基于存储的授权,然后想切换到Ranger授权,就必须设置Ranger授权。您可以配置 HMS 属性以进行此切换。

要集成 HMS API Ranger 以授权查询,您需要使用 Cloudera Manager 将以下 HMS 属性和值添加到 hive-site.xml

hive.metastore.pre.event.listeners

org.apache.hadoop.hive.ql.security.authorization. \
plugin.metastore.HiveMetaStoreAuthorizer

配置 HMS 写入

hive.security.authenticator.manager

值:org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator

使用 Cloudera Manager 安全阀将属性添加到 hive-site.xml

5.1  配置步骤

1.    Cloudera Manager 中,要配置Hive Metastore 属性,请单击Clusters > Hive-1 > Configuration

2.   搜索Hive-site

3.   hive-site.xml Hive Metastore 服务器高级配置片段(安全阀)中,单击+

CDP的Hive3系列之Hive Metastore介绍

4.   添加属性名称和值

5.   重复步骤以添加其他属性

6.   保存更改

配置HMS 属性以进行授

作为管理员,如果您对查询授权有任何问题,您可能需要通过 Ranger 设置 Apache Hive Metastore (HMS) 授权。比如你配置了Hive查询的基于存储的授权,然后想切换到Ranger授权,就必须设置Ranger授权。您可以配置 HMS 属性以进行此切换。

要集成 HMS API Ranger 以授权查询,您需要使用 Cloudera Manager 将以下 HMS 属性和值添加到 hive-site.xml

hive.metastore.pre.event.listeners

价值

org.apache.hadoop.hive.ql.security.authorization. \
plugin.metastore.HiveMetaStoreAuthorizer

配置 HMS 写入

hive.security.authenticator.manager

值:org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator

使用 Cloudera Manager 安全阀将属性添加到 hive-site.xml,如下一节所述

1.    Cloudera Manager 中,要配置Hive Metastore 属性,请单击Clusters > Hive-1 > Configuration

2.   搜索蜂巢站点

3.   hive-site.xml Hive Metastore 服务器高级配置片段(安全阀)中,单击+

CDP的Hive3系列之Hive Metastore介绍

4.   添加属性名称和值

5.   重复步骤以添加其他属性

6.   保存更改

原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/hive-metastore/topics/hive_apache_spark_hive_connection_configuration.html

https://docs.cloudera.com/cdp-private-cloud-base/latest/hive-metastore/topics/hive-hms-table-storage.html

https://docs.cloudera.com/cdp-private-cloud-base/latest/hive-metastore/topics/hive-hms-ha-configuration.html

https://docs.cloudera.com/cdp-private-cloud-base/7.1.6/hive-hms-overview/topics/hive-hms-introduction.html

上一篇:CDP中的Hive3系列之管理Hive的工作负载


下一篇: