基本介绍
数据库、表、函数等 Hive 对象的定义存储在 Metastore 中。 根据系统的配置方式,统计数据和授权记录也可能存储在那里。 Hive 和其他执行引擎在运行时使用此数据来确定如何解析、授权和有效执行用户查询。
Metastore 通过 DataNucleus 将对象定义保存到关系数据库 (RDBMS),DataNucleus 是一个基于 Java JDO 的对象关系映射 (ORM) 层。 有关可以使用的受支持 RDBMS 的列表,请参阅下面的受支持 RDBMS。
Metastore 可以配置为嵌入 Apache Derby RDBMS 或连接到外部 RDBMS。 Metastore 本身可以完全嵌入到用户进程中,也可以作为服务运行以供其他进程连接。 下面将依次讨论这些选项中的每一个。
从Hive2迁移到Hive 3
从 Hive 3.0 开始,Metastore 无需安装 Hive 的其余部分即可运行。 它作为单独的版本提供,以便允许非 Hive 系统轻松地与其集成。 (但是,为了方便起见,它仍包含在 Hive 版本中。)使 Metastore 成为独立服务涉及更改许多配置参数名称和工具名称。 所有旧的配置参数和工具仍然有效,以最大限度地向后兼容性。 本文档将涵盖旧名称和新名称。 随着新功能的添加,将不会添加 Hive 样式名称。
有关在没有 Hive 的情况下使用 Metastore 的详细信息,请参阅下面的在没有 Hive 的情况下运行 Metastore。
一般配置
Metastore 从文件 metastore-site.xml 读取其配置。 它希望在 $METASTORE_HOME/conf 中找到这个文件,其中 $METASTORE_HOME 是一个环境变量。 为了向后兼容,它还将读取在 HIVE_HOME/conf 中找到的任何 hive-site.xml 或 hive-metastoresite.xml 文件。 也可以在命令行上定义配置选项(请参阅下面的启动和停止服务)。
特定于运行带有各种 RDBMS、嵌入或作为服务且没有 Hive 的 Metastore 的配置值在相关部分中讨论。 以下配置值适用于 Metastore,无论它如何运行。 此表仅涵盖常用的自定义配置值。 对于不太常更改的配置值,请参阅不太常更改的配置参数。
参数 | Hive 2参数 | 默认值 | 参数说明 |
---|---|---|---|
metastore.warehouse.dir | hive.metastore.warehouse.dir | 默认目录和数据库中表的默认位置的 URI。 | |
datanucleus.schema.autoCreateAll | datanucleus.schema.autoCreateAll | false | 如果不存在,则自动在启动时在 RDBMS 中创建必要的模式。 创建一次后将其设置为false。 要启用自动创建还设置 hive.metastore.schema.verification=false。 不建议在生产中自动创建,而是改为运行 schematool。 |
metastore.schema.verification | hive.metastore.schema.verification | true | 强制 Metastore 架构版本一致性。 设置为 true 时:验证存储在 RDBMS 中的版本信息是否与 Metastore jar 的版本兼容。 还要禁用自动架构迁移。 升级后需要用户手动迁移schema,保证schema的正确迁移。 强烈建议在生产中使用此设置。 设置为 false 时:如果存储在 RDBMS 中的版本信息与 Metastore jar 的版本不匹配并允许自动模式迁移,则发出警告。 |
metastore.hmshandler.retry.attempts | hive.hmshandler.retry.attempts | 10 | 出现连接错误时重试调用 meastore 的次数。 |
metastore.hmshandler.retry.interval | hive.hmshandler.retry.interval | 2sec | 重试时间间隔 |
metastore.log4j.file | hive.log4j.file | none | Log4j 配置文件。 如果未设置将在 $METASTORE_HOME/conf 中查找 metastore-log4j2.properties |
metastore.stats.autogather | hive.stats.autogather | true | 是否在插入命令期间自动收集基本统计信息。 |
RDBMS
选择一:内置Derby
Metastore 可以在内置Apache Derby 的情况下运行。 这是默认配置。 但是,它不适用于简单测试之外的用途。 在此配置中,只有一个客户端可以使用 Metastore,并且任何更改都不会在客户端的生命周期之外持久化(因为它使用内存版本的 Derby)。
选择二:外部RDBMS
对于任何持久的多用户安装,应该使用外部 RDBMS 来存储 Metastore 对象。 Metastore 通过 JDBC 连接到外部 RDBMS。 您的 RDBMS 的 JDBC 驱动程序所需的任何 jar 都应放在 METASTORE_HOME/lib 中或在命令行上传递。 需要配置以下值以将 Metastore 连接到 RDBMS。 (注意:这些配置参数在 Hive 2 和 3 之间没有变化。)
配置参数 | 注释 |
---|---|
javax.jdo.option.ConnectionDriverName | JDBC driver class |
javax.jdo.option.ConnectionPassword | Password to connect to the RDBMS with. The Metastore uses Hadoop's CredentialProvider API so this does not have to be stored in clear text in your configuration file. |
javax.jdo.option.ConnectionURL | Connection URL for the JDBC driver |
javax.jdo.option.ConnectionUserName | User name to connect to the RDBMS with |
支持的RDBMSs
由于 Metastore 使用 DataNucleus 与 RDBMS 进行通信,因此理论上 DataNucleus 支持的任何存储选项都可以与 Metastore 一起使用。 但是,我们只测试并推荐以下内容:
RDBMS | Minimum Version | javax.jdo.option.ConnectionURL | javax.jdo.option.ConnectionDriverName |
---|---|---|---|
MariaDB | 5.5 | jdbc:mysql://:/ | org.mariadb.jdbc.Driver |
MS SQL Server | 2008 R2 | jdbc:sqlserver://:;DatabaseName= | com.microsoft.sqlserver.jdbc.SQLServerDriver |
MySQL | 5.6.17 | jdbc:mysql://:/ | com.mysql.jdbc.Driver |
Oracle* | 11g | jdbc:oracle:thin:@//:/xe | oracle.jdbc.OracleDriver |
Postgres | 9.1.13 | jdbc:postgresql://:/ | org.postgresql.Driver |
= RDBMS所在的机器
= RDBMS JDBC监听的端口
= Metastore存储的数据库(或schema)名称
*显示的 Oracle 值适用于 Oracle 的thin JDBC 客户端。 如果您使用不同的客户端,ConnectionURL 和 ConnectionDriverName 值将不同。
特别注意:使用Postgres时,需要将配置参数metastore.try.direct.sql.ddl(以前是hive.metastore.try.direct.sql.ddl)设置为false,以避免某些操作失败。
安装与升级Metastore Schema
Metastore 提供了 schematool 实用程序来处理 RDBMS 中的 Metastore 模式。 有关选项的完整列表,请参阅该工具的 -help 选项。 下面总结了该工具可以做什么。 在大多数情况下,schematool 可以从 metastore-site.xml 文件中读取配置,但配置也可以作为命令行上的选项传递。
- -initSchema:安装新schema。 这应该在第一次设置 Metastore 时使用。
- -upgradeSchema:升级到新安装的版本。 对于 3.0,可以从 1.2、2.0、2.1、2.2 和 2.3 升级到 3.0。 如果需要从 1.2 之前升级,请使用旧版本的 Hive 的 schematool 先将您的 schema 升级到 1.2,然后使用当前的 Metastore 版本升级到 3.0。
- -createUser:创建 Metastore 用户和schema。 这不会安装表,它只会创建数据库用户和模式。 这在生产环境中可能不起作用,因为您可能没有创建用户和架构的权限。 您可能需要 DBA 为您执行此操作。
- -validate:检查您的 Metastore schema对于其记录的版本是否正确
运行Metastore
内置模式
Metastore 可以作为库直接嵌入到进程中。 这通常是通过 HiveServer2 完成的,以避免元数据操作的额外网络抖动。 也可以在使用 Hive CLI 或任何其他进程时完成。 此模式是默认模式,将在未设置配置参数 metastore.uris 的任何时候使用。
除了在 HiveServer2 的情况下,使用这种模式会引起一些问题。 首先,拥有许多客户端会给支持的 RDBMS 带来负担,因为每个客户端都有自己的一组连接。 其次,每个客户端都必须具有对 RDBMS 的读/写访问权限。 这使得很难正确保护 RDBMS。 因此,除了 HiveServer2 之外,不建议在生产中使用嵌入式模式。
Metastore Server模式
要将 Metastore 作为服务运行,您必须首先使用 URL 对其进行配置。
Configured On | Parameter | Hive 2 Parameter | Format | Default Value | Comment |
---|---|---|---|---|---|
Server | metastore.thrift.port | hive.metastore.port | integer | 9083 | Port Thrift will listen on. |
Client | metastore.thrift.uris | hive.metastore.uris | thrift://:[, thrift://:...] | none | HOST = hostname, PORT = should be set to match metastore.thrift.port on the server (which defaults to 9083. You can provide multiple servers in a comma separate list. |
配置好客户端后,您可以使用 start-metastore 实用程序在服务器上启动 Metastore。 有关可用选项,请参阅该实用程序的 -help 选项。 没有 stop-metastore 脚本。 您必须找到 Metastore 的进程 ID 并终止该进程。
高可用
Metastore 服务是无状态的。 这允许您启动服务的多个实例以提供高可用性。 它还允许您配置一些客户端以嵌入 Metastore(例如 HiveServer2),同时仍为其他客户端运行 Metastore 服务。 如果您正在运行多个 Metastore 服务,您可以将它们的所有 URI 放入客户端的 metastore.thrift.uris 值中,然后将 metastore.thrift.uri.selection (在 Hive 2 hive.metastore.uri.selection 中)设置为 RANDOM 或 SEQUENTIAL。 RANDOM 将导致您的客户端随机选择列表中的服务器之一,而 SEQUENTIAL 将使其从列表的开头开始并尝试按顺序连接到每个服务器。
配置metastore安全
配置kerberos以及SSL
独立运行Metastore而无需Hive
从 Hive 3.0 开始,Metastore 作为单独的包发布,可以在没有 Hive 其余部分的情况下运行。 这称为独立模式。
默认情况下,Metastore 配置为与 Hive 一起使用,因此必须在此配置中更改一些配置参数。
Configuration Parameter | Set to for Standalone Mode |
---|---|
metastore.task.threads.always | org.apache.hadoop.hive.metastore.events.EventCleanerTask,org.apache.hadoop.hive.metastore.MaterializationsCacheCleanerTask |
metastore.expression.proxy | org.apache.hadoop.hive.metastore.DefaultPartitionExpressionProxy |
目前,以下功能尚未经过测试或已知无法在独立模式下与 Metastore 一起使用:
压缩器(用于 ACID 表)在没有 Hive 的情况下无法运行。 可以读取和写入 ACID 表,但不能压缩它们。
复制尚未在 Hive 之外进行测试。
性能优化
在 Hive 3.0 之前,只有一个 MetaStore API 实现(称为 ObjectStore)。 HIVE-16520 引入了第二个实现,可以将数据库中的对象缓存在内存中。 这可以为往返数据库节省大量时间。 可以通过将参数 metastore.rawstore.impl 更改为 org.apache.hadoop.hive.metastore.cache.CachedStore 来使用它。
当通过此 MetaStore 进行更改时,缓存会自动更新为新数据。 在有多个 MetaStore 服务器的情况下,其中一些服务器的缓存可能已经过时。 为了防止这种情况,CachedStore 会以可配置的频率(默认值:1 分钟)自动刷新缓存。
有关 CachedStore 的所有属性的详细信息可以在配置属性(前缀:metastore.cached)上找到。
较少更改的配置参数
BATCHED_RETRIEVE_, CLIENT_CONNECT_RETRY_DELAY, FILTER_HOOK, SERDES_USING_METASTORE_FOR_SCHEMA, SERVER__THREADS,
THREAD_POOL_SIZE
Security: EXECUTE_SET_UGI, metastore.authorization.storage.checks
Setting up Caching: CACHED, CATALOGS_TO_CACHE & AGGREGATE_STATS_CACHE
Transactions: MAX_OPEN_TXNS, TXNS_*