Hive Metastore概述
Hive Metastore(HMS)是一项单独的服务,不是Hive的一部分,甚至不必位于同一集群上。HMS将元数据存储在Hive、Impala、Spark和其他组件的后端。
Beeline、Hue、JDBC和Impala Shell客户端通过thrift或JDBC向HiveServer发出请求。冗余的HiveServer是被动的,可提供故障转移服务。HiveServer实例将数据读取/写入HMS。后端的一个或多个HMS实例可以与其他服务(例如Ranger)对话。冗余HMS是被动的,可提供故障转移服务。物理数据驻留在后端RDBMS中,一个用于HMS,一个用于安全服务,例如Ranger。在任何给定时间,所有连接都会路由到单个RDBMS服务。HMS通过thrift与NameNode进行对话,并充当HDFS的客户端。
HMS表存储
您需要了解在运行CREATE TABLE语句或将表迁移到Cloudera Data Platform时HMS如何存储Hive表。语句的成功或失败,结果表类型和表位置取决于许多因素。
HMS表转换
HMS包含以下有关您创建的表的Hive元数据:
• 表定义
• 列名
• 数据类型
• 集中的Schema存储库中的注释
在CREATE TABLE语句中使用EXTERNAL关键字时,HMS将表存储为外部表。当您省略EXTERNAL关键字并创建托管表或从托管表摄取数据时,HMS可能会将表转换为外部表,否则表创建可能失败,具体取决于表属性。影响表转换的重要表属性是ACID或Non-ACID表类型:
• 非ACID
表属性不包含任何设置为true的与ACID相关的属性。例如,该表不包含此类属性transactional = true或insert_only = true
• ACID
表属性确实包含一个或多个设置为true的ACID属性。
• Full-ACID
表属性包含transactional = true但不包含insert_only = true
• 仅插入的ACID
表属性包含insert_only = true。
以下矩阵显示了表类型以及是否支持location属性。
ACID | 受管 | 位置属性 | 注释 | 行动 |
---|---|---|---|---|
非ACID | 是 | 是 | 迁移到CDP,例如从HDP或CDH集群。 | 表存储为外部 |
非ACID,ACID,完整ACID,仅插入ACID | 是 | 没有 | 表位置为空 | 表存储在子目录中 metastore.warehouse.external.dir |
HMS检测用于与HMS进行交互的客户端类型,例如Hive或Spark,并将客户端的功能与表要求进行比较。HMS根据比较结果执行以下操作:
表要求 | 客户符合要求 | 托管表 | ACID表类型 | 行动 | |
---|---|---|---|---|---|
客户端可以写入任何类型的ACID表 | 没有 | 是 | 是 | 创建表失败 | |
客户端可以写入完整的ACID表 | 没有 | 是 | insert_only = true | 创建表失败 | |
客户端可以写入仅插入的ACID表 | 没有 | 是 | insert_only = true | 创建表失败 |
例如,如果Spark客户端不具备所需的功能,则会出现以下类型的错误消息:
代码语言:javascript复制Spark has no access to table `mytable`. Clients can access this table only if
they have the following capabilities: CONNECTORREAD,HIVEFULLACIDREAD, HIVEFULLACIDWRITE,
HIVEMANAGESTATS, HIVECACHEINVALIDATE, . . .
配置HMS属性以进行授权
作为管理员,如果您对查询授权有任何疑问,则可能需要通过Ranger设置Apache Hive Metastore(HMS)授权。例如,如果您配置了Hive查询的基于存储的授权,然后又想通过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属性,请单击集群> Hive-1 >配置。
2) 搜索Hive-site。
在hive-site.xml的Hive Metastore Server高级配置代码段(安全阀)中,单击 。
3) 添加属性名称和值。
4) 重复步骤以添加其他属性。
5) 保存更改。
过滤HMS结果
编写用于从Hive筛选数据的API后,您需要知道如何设置、启用和禁用API。您需要使用Cloudera Manager在hive-site.xml的安全阀中添加一些Hive Metastore(HMS)属性 。
HMS可以对读取操作返回的数据执行服务器端过滤。默认情况下启用筛选,该筛选根据用户身份显示语句的结果,例如SHOW TABLES或SHOW DATABASES。您可以通过设置布尔标志和挂钩来禁用过滤。该钩子标识实现过滤的类名。您在hive-site.xml中为HMS API-Ranger集成添加了以下属性和值 :
metastore.server.filter.enabled值:true(进行过滤)或false(不进行过滤)
metastore.filter.hook值:org.apache.hadoop.hive.ql.security.authorization.plugin.metastore.HiveMetaStoreAuthorizer
如上一节所述添加属性。
设置Metastore数据库
如果您具有本地集群,则需要知道如何为Hive Metastore(HMS)设置后端数据库。设置包括安装受支持的数据库、配置属性、指定metastore位置以及可选的连接参数。
在CDP私有云基础中,您需要为Hive Metastore(HMS)安装受支持的数据库以存储元数据。您可以通过修改配置Hive Metastore到hive-site.xml 。您可以使用Cloudera Manager安全阀功能,而不要 hive set key=value在命令行上使用。
调优Metastore
通常,您需要限制与Hive Metastore的并发连接。随着打开的连接数量的增加,延迟也会增加。后端数据库问题,Hive使用不当(例如极其复杂的查询,连接泄漏)和其他因素可能会影响性能。
CDP私有云基础中的常规Metastore调优
尝试进行以下更改以调整HMS性能:
• 购买SSD用于一个或多个HMS。
• Cloudera建议单个查询访问不超过10,000个表分区。如果查询的表进行了联接,请计算跨所有表访问的合并分区数。
• 调整后端(RDBMS)。HiveServer连接到HMS,只有HMS连接到RDBMS。后端花费的时间越长,HMS需要更多的内存来响应相同的请求。限制后端数据库中的连接数。
MySQL:例如,在/etc/my.cnf中:
代码语言:javascript复制[mysqld]
datadir=/var/lib/mysql
max_connections=8192
. . .
MariaDB:例如,在/etc/systemd/system/mariadb.service.d/limits.conf中:
代码语言:javascript复制[Service]
LimitNOFILE=24000
. . .
使用默认的thrift属性(8K):
代码语言:javascript复制hive.server2.async.exec.threads 8192
hive.server2.async.exec.wait.queue.size 8192
hive.server2.thrift.max.worker.threads 8192
为您的应用程序设置datanucleus.connectionPool.maxPoolSize。例如,如果poolSize = 100,具有3个HMS实例(一个专门用于压缩),并且每个服务器具有4个池,则可以容纳1200个连接。
来源:https://docs.cloudera.com/cdp-private-cloud-base/7.1.3/hive-hms-overview/topics/hive-hms-introduction.html
https://docs.cloudera.com/cdp-private-cloud-base/7.1.3/hive-metastore/topics/hive-hms-table-storage.html