这是CDP中Apache Hive3用户指南系列之一,之后还有几篇来介绍Hive3的功能和使用。
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的RDBMS。所有的 HMS 实例使用相同的后端数据库。一个单独的 RDBMS 支持安全服务,例如 Ranger。在任何给定时间,所有连接都路由到单一的 RDBMS 服务。HMS 通过thrift与 NameNode 对话,并充当 HDFS 的客户端。
HMS 直接连接到 Ranger 和 NameNode (HDFS),HiveServer 也是如此,但为简单起见,该图中并未显示。后端的一个或多个 HMS 实例可以与其他服务(例如 Ranger)通信。
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
,然后保存更改。
Kerberos 委托令牌的存储由 hive.cluster.delegation.token.store.class
属性定义。可用的选择是 Zookeeper、Metastore 和内存。Cloudera 建议通过设置org.apache.hadoop.hive.thrift.DBTokenStore 属性来使用数据库。
4. 单击实例>操作>添加角色实例
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。
下图展示了典型的读授权流程:
下图展示了典型的写授权流程:
写入时,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 用例。
4 授权外部表
作为管理员,您需要了解如何授权用户对Apache Hive 外部表进行读写,包括使用Spark SQL、Hue 和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 服务器高级配置片段(安全阀)中,单击+。
4. 添加属性名称和值。
5. 重复步骤以添加其他属性。
6. 保存更改。
7. 为用户配置表的文件级权限。
只有对外部表具有文件级权限的用户才能访问外部表。
5 配置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 服务器高级配置片段(安全阀)中,单击+。
4. 添加属性名称和值。
5. 重复步骤以添加其他属性。
6. 保存更改。
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 服务器高级配置片段(安全阀)中,单击+。
4. 添加属性名称和值。
5. 重复步骤以添加其他属性。
6. 保存更改。