On this page
Replication
Overview
Hive Replication 构建在metastore event和ExIm功能的基础上,为在集群之间复制 Hive 元数据和数据更改提供了框架。不需要源集群和副本运行相同的 Hadoop 发行版,Hive 版本或元存储 RDBMS。复制系统具有相当“轻巧的触感”,表现出较低的耦合度,并使用 Hive-metastore Thrift 服务作为集成点。但是,当前的实现不是“开箱即用”的解决方案。特别是,有必要提供某种编排服务,该服务负责请求复制任务并执行它们。
有关 Hive 中复制设计的信息,请参见HiveReplicationDevelopment。
Hive 正在实现更高级的复制机制,以解决此模式的某些限制.有关详情,请参见HiveReplicationv2Development.
Potential Uses
灾难恢复集群。
将数据复制到云中以进行内部部署处理。
Prerequisites
您必须在复制源上运行 Hive 1.1.0 或更高版本(以获得
DbNotificationListener
支持)。您必须在复制目标上运行 Hive 0.8.0 或更高版本(以获得
IMPORT
支持)。您将需要 Hive 1.2.0 或更高版本的 JAR 依赖关系来实例化和执行
ReplicationTasks
。这不是集群要求;仅对于编排复制的服务才需要。最初,您将需要在源群集上具有 Management 特权才能启用将通知写入 Metastore 数据库的功能。
Limitations
尽管 metastore 事件功能允许将通知下沉到实现
MetaStoreEventListener
的任何对象,但是复制功能的实现只能从 metastore 数据库中获取事件,因此必须使用DbNotificationListener
。使用 HCatalogWriters 附加到表或分区的数据将不会自动复制,因为它们当前未生成元存储通知(HIVE-9577)。仅当 Hive 外部的进程将数据写入表时,这才可能是一个考虑因素。
Configuration
要配置 metastore 通知事件的持久性,必须在源集群上设置以下hive-site.xml
属性。要使设置生效,需要重新启动 Metastore 服务。
用于复制的 hive-site.xml 配置
<property>
<name>hive.metastore.event.listeners</name>
<value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>
<property>
<name>hive.metastore.event.db.listener.timetolive</name>
<value>86400s</value>
</property>
系统默认使用org.apache.hive.hcatalog.api.repl.exim.EximReplicationTaskFactory
。这使用EXPORT
和IMPORT
命令来捕获,移动和摄取需要复制的元数据和数据。但是,可以通过设置hive.repl.task.factory
Hive 配置属性来提供自定义实现。
典型操作模式
通过在源集群上配置 metastore 事件,在 metastore 的
NOTIFICATION_LOG
表中将填充成功执行元数据操作(例如CREATE
,ALTER
和DROP
)的事件。这些事件可以使用
org.apache.hive.hcatalog.api.HCatClient.getReplicationTasks(long, int, String, String)
读取并转换为ReplicationTasks
。ReplicationTasks
封装了一组在源 Hive 实例上执行的命令(通常用于导出数据)和另一组在副本实例上执行的命令(通常用于导入数据)。这些命令作为 Hive SQL 字符串提供。ReplicationTask
还可以用作声明数据库和表名 Map 以及StagingDirectoryProvider
实现的位置,以实现源和目标路径的解析:org.apache.hive.hcatalog.api.repl.ReplicationTask.withDbNameMapping(Function<String, String>)
org.apache.hive.hcatalog.api.repl.ReplicationTask.withTableNameMapping(Function<String, String>)
org.apache.hive.hcatalog.api.repl.ReplicationTask.withSrcStagingDirProvider(StagingDirectoryProvider)
org.apache.hive.hcatalog.api.repl.ReplicationTask.withDstStagingDirProvider(StagingDirectoryProvider)
然后,必须针对源 Hive 然后针对目标(即副本)执行由任务提供的 Hive SQL 命令。一种方法是打开与各个 HiveServer 的 JDBC 连接,然后提交任务的 Hive SQL 查询。
有必要保持通知日志中的位置,以便复制任务仅应用一次。这可以通过维护上一个成功执行的事件的 ID(
task.getEvent().getEventId()
)的记录并将其作为获取下一批事件的偏移量来实现。为避免丢失或丢失需要复制的事件,明智的做法是以比从
hive.metastore.event.db.listener.timetolive
属性派生的频率大得多的频率轮询复制任务。如果未及时使用通知,则复制服务可以将其从表中清除,然后再进行操作。
复制到 AWS/EMR/S3
目前,无法复制到 E3 中在 S3 中具有路径位置的表。这是由于 EMR 发行版中IMPORT
命令的依赖性存在错误(在 AMI-4.2.0 中进行了检查)。另外,如果使用EximReplicationTaskFactory
,则可能需要在 Hive 配置中添加相关的 S3 协议:
S3 上的 ExIm 的 HiveConf 配置
<property>
<name>hive.exim.uri.scheme.whitelist</name>
<value>hdfs,s3a</value>
</property>