Metastore
Metadata
- 元数据包含用Hive创建的database、table等的元信息
- 元数据存储在关系型数据库中。如Derby、MySQL等。
Metastore作用
- 存储元数据的能力,需要借助Metastore的MetastoreDB,也就是说Metastore 是通过对特定的数据库进操作完成了元数据的存储
- 对外提供服务的能力,客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。
- 其实我们可以看到metastore类似一个中间件,这个中间件使得我们对元数据的操作可以不再依赖特定的数据库API 完成了解耦的同时,还提高了系统的安全性和可扩展性,如果有一天对元数据的访问或者元数据的存储出现了瓶颈我们也可以很方便的进行扩容。
Metastore 服务
我们常说的Metastore 其实就是指的是Metastore 服务,服务的意思我们应该都知道,例如我们常见的接口服务,web 服务 既然是服务就得向外暴露服务接口,不然客户端怎么服务端发起请求呢,其实到这里我们可以看到Metastore其实就是一个服务端,和我们常见的接口服务一样,只不过这个服务端依赖一个数据库,从而可以存储元数据。
说到服务端,或者说到接口我们就知道通信的协议,我们常见的就是 rpc 和 http 协议,我们的Metastore 使用的是Apache Thrift 框架,而这个框架其实是一个 rpc 协议框架,我们常见的接口是http 协议,常见的RPC框架包括:Thrift、gRPC、Finagle、Dubbo等等。
Metastore 的三种配置方式
由于元数据不断地修改、更新,所以 Hive 元数据不适合存储在 HDFS 中,一般存在 RDBMS 中,如 Mysql、Derby。元数据的存储支持三种不同配置方式:
内嵌模式
默认情况下,metastore 服务和 Hive 的服务运行在同一个 JVM 中,包含了一个内嵌的以本地磁盘作为存储的Derby( Hive 自带的数据库)数据库实例。同时,这种配置也被称为内嵌配置。但是这种方式的不好之处就在于每次只有一个内嵌的 Derby 数据库可以访问某个磁盘上的数据文件,也就是说一次只能为每个 metastore 打开一个 hive 会话。如果尝试连接多个,会报错。这样效率很低。
本地模式
如果要支持多会话,或者多用户的话,需要使用一个独立的数据库(比如 mysql 比较常用),这种配置方式称为本地 metastore 配置。虽然这种方式 Hvie 服务和 Metastore 服务仍然在一个 JVM 进程中,但连接的却是另外一个进程中运行的数据库,在同一台机器上或者远程机器上。任何 JDBC 兼容的数据库都可以通过 javax.jdo.option.* 配置属性来供 metastore 使用。
本地模式具体配置示例:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
</configuration>
远程配置
还有一种配置是远程 metastore 配置,这种配置情况下,一个或多个 metastore 服务器和 Hive 服务运行在不同的进程中。这样一来,数据库层可以完全置于防火墙后,客户端则不需要数据库凭证(密码账号),从而提供了更好的可管理性和安全。可以通过 hive.metastore.uris 设置为 metastore 服务器 URI(如果有多个服务器,可以用逗号分割),把 hive 服务设为使用远程 metastore 服务器的URI的格式为:thrift://host:port。
注意,仅连接远程的 mysql 并不能称之为“远程模式”,是否远程指的是 metastore 和 hive 服务是否在同一进程内。
远程模式配置示例如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.1.188:9083</valu>
</property>
</configuration>
总结
Metastore 其实就是一个提供了对元数据进行各种操作的服务端,这个服务端底层通过数据库对元数据进行存储。
|