HCatalog 리더·라이터 인터페이스
HCatalog 리더·라이터 인터페이스 (HCatalog Reader and Writer Interfaces)
개요
HCatalog는 MapReduce를 사용하지 않고도 병렬 입출력을 위한 **데이터 전송 API(Data Transfer API)**를 제공해요. 이 API를 사용하면 테이블과 행(row)이라는 기본적인 저장소 추상화를 바탕으로 Hadoop 클러스터에서 데이터를 읽거나 쓸 수 있습니다.
데이터 전송 API에는 세 가지 핵심 클래스가 있어요.
HCatReader– Hadoop 클러스터에서 데이터를 읽는 클래스HCatWriter– Hadoop 클러스터에 데이터를 쓰는 클래스DataTransferFactory– 리더·라이터 인스턴스를 생성하는 팩토리
데이터 전송 API의 보조 클래스에는 다음이 포함됩니다.
ReadEntityReaderContextWriteEntityWriterContext
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);
그런 다음 writer는 write 메서드의 인자로 이터레이터(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단계 구조를 이해하는 것이 핵심입니다.