HCatalog 리더·라이터 인터페이스

HCatalog 리더·라이터 인터페이스 (HCatalog Reader and Writer Interfaces)

개요

HCatalog는 MapReduce를 사용하지 않고도 병렬 입출력을 위한 **데이터 전송 API(Data Transfer API)**를 제공해요. 이 API를 사용하면 테이블과 행(row)이라는 기본적인 저장소 추상화를 바탕으로 Hadoop 클러스터에서 데이터를 읽거나 쓸 수 있습니다.

데이터 전송 API에는 세 가지 핵심 클래스가 있어요.

  • HCatReader – Hadoop 클러스터에서 데이터를 읽는 클래스
  • HCatWriter – Hadoop 클러스터에 데이터를 쓰는 클래스
  • DataTransferFactory – 리더·라이터 인스턴스를 생성하는 팩토리

데이터 전송 API의 보조 클래스에는 다음이 포함됩니다.

  • ReadEntity
  • ReaderContext
  • WriteEntity
  • WriterContext

HCatalog 데이터 전송 API는 외부 시스템과 Hadoop의 통합을 쉽게 하기 위해 설계되었어요.

참고: HCatalog는 스레드 안전(thread safe)하지 않아요.

출처: 문서

본문

HCatReader

읽기는 두 단계 과정으로 진행돼요. 첫 번째 단계는 외부 시스템의 마스터 노드에서 일어나고, 두 번째 단계는 여러 슬레이브 노드에서 병렬로 수행됩니다.

읽기는 "ReadEntity"에 대해 수행돼요. 읽기를 시작하기 전에, 읽어올 ReadEntity를 정의해야 합니다. 이는 ReadEntity.Builder를 통해 할 수 있으며, 데이터베이스 이름, 테이블 이름, 파티션, 필터 문자열을 지정할 수 있어요. 예를 들어:

ReadEntity.Builder builder = new ReadEntity.Builder();
ReadEntity entity = builder.withDatabase("mydb").withTable("mytbl").build();

위 코드 조각은 "mydb"라는 데이터베이스에 있는 "mytbl"이라는 테이블로 구성된 ReadEntity 객체(entity)를 정의해요. 이 객체는 해당 테이블의 모든 행을 읽는 데 사용할 수 있습니다. 참고로 이 테이블은 작업이 시작되기 전에 HCatalog에 반드시 존재해야 해요.

ReadEntity를 정의한 후에는 ReadEntity와 클러스터 구성을 사용해 HCatReader 인스턴스를 얻습니다.

HCatReader reader = DataTransferFactory.getHCatReader(entity, config);

다음 단계는 reader로부터 ReaderContext를 얻는 것이에요.

ReaderContext cntxt = reader.prepareRead();

위 단계들은 모두 마스터 노드에서 일어나요. 마스터 노드는 이 ReaderContext 객체를 직렬화해 모든 슬레이브 노드에 보냅니다. 슬레이브 노드는 이 리더 컨텍스트를 사용해 데이터를 읽어요.

for(InputSplit split : readCntxt.getSplits()){
  HCatReader reader = DataTransferFactory.getHCatReader(split, readerCntxt.getConf());
  Iterator<HCatRecord> itr = reader.read();
  while(itr.hasNext()){
    HCatRecord read = itr.next();
  }
}

HCatWriter

읽기와 비슷하게, 쓰기도 두 단계 과정으로 진행되며 첫 번째 단계는 마스터 노드에서 일어나요. 이후 두 번째 단계는 슬레이브 노드에서 병렬로 수행됩니다.

쓰기는 "WriteEntity"에 대해 수행되며, 읽기와 비슷한 방식으로 구성할 수 있어요.

WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withDatabase("mydb").withTable("mytbl").build();

위 코드는 "mydb" 데이터베이스의 "mytbl" 테이블에 쓰는 데 사용할 수 있는 WriteEntity 객체(entity)를 만들어요.

WriteEntity를 만든 후 다음 단계는 WriterContext를 얻는 것이에요.

HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
WriterContext info = writer.prepareWrite();

위 단계들은 모두 마스터 노드에서 일어나요. 마스터 노드는 WriterContext 객체를 직렬화해 모든 슬레이브에 제공합니다.

슬레이브 노드에서는 WriterContext를 사용해 HCatWriter를 얻어야 해요.

HCatWriter writer = DataTransferFactory.getHCatWriter(context);

그런 다음 writerwrite 메서드의 인자로 이터레이터(iterator)를 받습니다.

writer.write(hCatRecordItr);

writer는 이 이터레이터에 대해 루프로 getNext()를 호출하며, 이터레이터에 연결된 모든 레코드를 씁니다.

완전한 예제 프로그램 (Complete Example Program)

위 리더·라이터 예제의 완전한 Java 프로그램은 다음에서 확인할 수 있어요: https://github.com/apache/hive/blob/trunk/hcatalog/core/src/test/java/org/apache/hive/hcatalog/data/TestReaderWriter.java

더 알아보기 (Learn more)

HCatalog의 데이터 전송 API(HCatReader/HCatWriter)는 MapReduce 없이도 외부 시스템이 Hadoop과 병렬로 데이터를 주고받을 수 있게 해 주는 저수준 인터페이스예요. 마스터에서 컨텍스트를 준비하고 슬레이브에서 병렬 처리하는 2단계 구조를 이해하는 것이 핵심입니다.