복제(Replication)

복제(Replication)

Hive 복제는 metastore 이벤트(event)와 ExIm 기능을 기반으로, 클러스터 간에 Hive 메타데이터와 데이터 변경을 복제하는 프레임워크를 제공해요. 소스 클러스터와 복제본이 같은 Hadoop 배포본, Hive 버전, metastore RDBMS를 쓸 필요가 없습니다.

출처: 문서

본문

개요(Overview)

복제 시스템은 낮은 결합도를 보이며 Hive-metastore Thrift 서비스를 통합점으로 사용해요. 다만 현재 구현은 'out of the box' 솔루션이 아닙니다. 특히 복제 태스크를 요청하고 실행할 책임을 가진 일종의 오케스트레이션 서비스를 제공해야 해요.

Hive 복제 설계에 대한 정보는 HiveReplicationDevelopment를 참고하세요.

이 모드의 일부 한계를 해결하기 위해 Hive에 더 고급 복제 메커니즘이 구현되고 있어요. 자세한 내용은 HiveReplicationv2Development를 보세요.

잠재적 용도(Potential Uses)

  • 재해 복구(Disaster recovery) 클러스터
  • 사내(off-premise) 처리를 위해 데이터를 클라우드로 복사

사전 요구 사항(Prerequisites)

  • 복제 소스에서 Hive 1.1.0 이상을 실행해야 해요 (DbNotificationListener 지원용).
  • 복제 대상에서 Hive 0.8.0 이상을 실행해야 해요 (IMPORT 지원용).
  • ReplicationTasks를 인스턴스화하고 실행하려면 Hive 1.2.0 이상 JAR 의존성이 필요해요. 이는 클러스터 요구 사항이 아니라 복제를 오케스트레이션하는 서비스에만 필요합니다.
  • 처음에는 소스 클러스터에서 metastore 데이터베이스에 알림(notification)을 기록하도록 하는 관리 권한이 필요해요.

한계(Limitations)

  • metastore 이벤트 기능은 MetaStoreEventListener를 구현하는 어떤 것이든 알림을 받게 할 수 있지만, 복제 기능의 구현은 metastore 데이터베이스에서만 이벤트를 가져올 수 있어서 DbNotificationListener를 사용해야 해요.
  • HCatalogWriters를 사용해 테이블이나 파티션에 추가된 데이터는 현재 metastore 알림을 생성하지 않으므로 자동으로 복제되지 않아요 (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 구성 속성을 설정하면 커스텀 구현을 제공할 수도 있어요.

전형적인 동작 방식(Typical Mode of Operation)

  • 소스 클러스터에서 metastore 이벤트 구성이 갖춰지면, CREATE, ALTER, DROP 같은 메타데이터 작업이 성공적으로 실행될 때 metastore의 NOTIFICATION_LOG 테이블에 이벤트가 채워집니다.
  • 이 이벤트들은 org.apache.hive.hcatalog.api.HCatClient.getReplicationTasks(long, int, String, String)로 읽어 ReplicationTasks로 변환할 수 있어요.
  • ReplicationTasks는 소스 Hive 인스턴스에서 실행할 명령 집합(보통 데이터 내보내기)과 복제본 인스턴스에서 실행할 명령 집합(보통 데이터 가져오기)을 캡슐화해요. 명령들은 Hive SQL 문자열로 제공됩니다.
  • ReplicationTask는 데이터베이스/테이블 이름 매핑을 선언하고, 소스/대상에서 경로를 해석하기 위한 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 SQL 명령은 소스 Hive에 대해, 그리고 대상(복제본)에 대해 각각 실행해야 해요. 한 가지 방법은 각각의 HiveServer에 JDBC 연결을 열어 태스크의 Hive SQL 쿼리를 제출하는 것입니다.
  • 알림 로그 내 위치를 유지해야 복제 태스크가 한 번만 적용돼요. 마지막으로 성공적으로 실행된 이벤트의 id(task.getEvent().getEventId()) 기록을 유지하고, 다음 이벤트 배치를 가져올 때 이를 오프셋으로 제공하면 됩니다.
  • 복제가 필요한 이벤트를 잃거나 놓치지 않으려면 hive.metastore.event.db.listener.timetolive 속성에서 파생된 주기보다 훨씬 자주 복제 태스크를 폴링하는 게 좋아요. 알림을 제때 소비하지 않으면 복제 서비스가 처리하기 전에 테이블에서 제거(purge)될 수 있습니다.

AWS/EMR/S3로 복제

현재는 경로 위치가 S3인 EMR의 테이블로 복제할 수 없어요. 이는 EMR 배포본(AMI-4.2.0에서 확인)의 IMPORT 명령 의존성 버그 때문입니다. 또한 EximReplicationTaskFactory를 사용한다면 Hive 구성에 관련 S3 프로토콜을 추가해야 할 수 있어요:

S3에서 ExIm을 위한 HiveConf 구성

  <property>
    <name>hive.exim.uri.scheme.whitelist</name>
    <value>hdfs,s3a</value>
  </property>

더 알아보기 (Learn more)

복제는 EXPORT/IMPORT를 기반으로 메타데이터와 데이터를 옮겨요. 사전 요구사항(버전 조건)과 알림 폴링 주기를 잘 지키면 안정적으로 운영할 수 있습니다.