Replication

Overview

Hive Replication 构建在metastore eventExIm功能的基础上,为在集群之间复制 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。这使用EXPORTIMPORT命令来捕获,移动和摄取需要复制的元数据和数据。但是,可以通过设置hive.repl.task.factory Hive 配置属性来提供自定义实现。

典型操作模式

  • 通过在源集群上配置 metastore 事件,在 metastore 的NOTIFICATION_LOG表中将填充成功执行元数据操作(例如CREATEALTERDROP)的事件。

  • 这些事件可以使用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>