CDP中的Hive3之Hive Metastore(HMS)
- 1、CDP中的HMS
- 2、HMS表的存储(转换)
- 3、HWC授权
1、CDP中的HMS
CDP中的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)通信
官方文档:https://docs.cloudera.com/cdp-private-cloud-base/latest/hive-hms-overview/topics/hive-hms-introduction.html
2、HMS表的存储(转换)
当运行CREATE TABLE语句或将表迁移到Cloudera Data Platform时,您需要了解HMS如何存储Hive表。语句的成功或失败、结果表类型和表位置取决于许多因素
HMS包含有关您创建的表的以下Hive元数据:
- 表的定义
- 列名
- 数据类型
- 中央的Schema存储库中的注释
当您在CREATE TABLE语句中使用EXTERNAL关键字时,HMS会将表存储为外部表。当您省略EXTERNAL关键字并创建托管表或摄取托管表时,HMS可能会将表转换为外部表,或者创建表可能会失败,这具体取决于表的属性
影响表转换的一个重要因素是表属性的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 | 创建表失败 |
客户端可以写入完全的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, . . .
官方文档:https://docs.cloudera.com/cdp-private-cloud-base/latest/hive-metastore/topics/hive-hms-table-storage.html
3、HWC授权
配置Hive仓库连接器(HWC)的方式会影响查询授权过程和安全性。有多种方法可以通过HWC访问Hive,并不是所有操作都通过HiveServer (HS2)。一些操作,例如Spark Direct Reader和Hive Streaming,通过HMS直接进入Hive,其中通常适用基于存储的权限
作为客户端用户,您必须在使用HWC之前使用kerberos登录。您需要适当的存储权限才能写入目标分区或表位置
您需要配置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
官方文档:https://docs.cloudera.com/cdp-private-cloud-base/latest/hive-metastore/topics/hive_apache_spark_hive_connection_configuration.html
参考文章:https://developer.aliyun.com/article/786098