![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO0EWZ3EjZkNDO5EGMxYmNhhzNjRGN0UWN1M2Y4EDM18CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1. 概念
MetaSore 是 Hive 元数据存储的地方。Hive 数据库、表、函数等的定义都存储在 Metastore 中。根据系统配置方式,统计信息和授权记录也可以存储在此处。Hive 或者其他执行引擎在运行时使用此数据来确定如何解析,授权以及有效执行用户查询。
MetaStore 分为两个部分:服务和后台数据的存储。
2. 配置参数
这里只会展示与 MetaStore 相关的配置参数,与 MetaSote 不相关的配置参数可以在这查阅。
Hive MetaSote 是无状态的,因此可以有多个实例来实现高可用性。使用 hive.metastore.uris 可以指定多个远程 MetaStore。Hive 将默认使用列表中的第一个,但会在连接失败时随机选择一个,并尝试重新连接。
3. 部署模式
MetaStore 分为三种部署模式:内嵌模式、本地模式以及远程模式。
3.1 内嵌MetaStore
默认情况下,MetaStore 服务和 Hive 服务运行在同一个 JVM 中,包含一个内嵌的以本地磁盘作为存储的 Derby 数据库实例。
使用内嵌的 MetaStore 是 Hive 入门最简单的方法。但是,每次只有一个内嵌的 Derby 数据库可以访问某个磁盘上的数据库文件,一次只能有一个进程可以连接到数据库,因此它并不是一个实际的解决方案,但对于单元测试来说效果很好,并不适合在生产环境使用。
|
3.2 本地MetaStore
如果要支持多会话(以及多租户),需要使用一个独立的数据库。这种配置方式成为本地配置,因为 MetaStore 服务仍然和 Hive 服务运行在同一个进程中,但连接的却是另一个进程中运行的数据库,在同一台机器上或者远程机器上。
对于独立的 MetaStore,MySQL 是一种很受欢迎的选择。本实例我们 MySQL 为例,具体看看如何配置:
|
在本地模式下不需要配置 hive.metastore.uris,默认为空表示是本地模式。
如果选择 MySQL 作为 MetaStore 存储数据库,需要提前将 MySQL 的驱动包拷贝到 $HIVE_HOME/lib目录下。
JDBC 连接驱动类视情况决定选择 com.mysql.cj.jdbc.Driver 还是 com.mysql.jdbc.Driver。
3.3 远程MetaStore
在远程模式下,MetaStore 服务和 Hive 服务运行在不同进程中。CLI、HiveServer2、HCatalog、Impala 以及其他进程使用 Thrift API(使用 hive.metastore.uris 属性配置)与 MetaStore 服务通信。MetaStore 服务通过 JDBC 与 MetaStore 数据库进行通信(使用 javax.jdo.option.ConnectionURL 属性配置):
在这种情况下,我们还可以单独部署一台 MetaStore 服务器,以提供更高可用性。这也可以有更好的可管理性/安全性,因为数据库层可以完全防火墙关闭。客户端不再需要与每个 Hiver 用户共享数据库凭据即可访问元存储数据库。
Hive MetaStore 服务端配置:
|
Hive MetaStore客户端配置:
|
4. 启动服务
我们可以通过执行以下命令来启动MetaStore服务:
|
如果我们在 hive-site.xml 配置文件中指定了 hive.metastore.uris 的 port:
|
我们就可以不指定端口进行启动:
|
注意客户端中的端口配置需要和启动监听的端口一致。
参考:AdminManual Metastore Administration