세그먼트 라이터 플러그인

세그먼트 라이터 플러그인 (Segment Writer Plugin)

GenericRow 레코드를 프로그래밍 방식으로 모아 전체 배치 수집 잡을 실행하지 않고 Pinot 세그먼트를 구축할 수 있는 API를 제공하는 세그먼트 라이터 플러그인에 대한 문서예요. 미니언 태스크나 커스텀 수집 파이프라인처럼 애플리케이션 코드에서 세그먼트를 생성해야 할 때 특히 유용해요.

출처: 문서

본문

세그먼트 라이터 플러그인은 전체 배치 수집 잡을 실행하지 않고 GenericRow 레코드를 프로그래밍 방식으로 모아 Pinot 세그먼트를 구축할 수 있는 API를 제공해요. 미니언 태스크나 커스텀 수집 파이프라인처럼 애플리케이션 코드에서 세그먼트를 생성해야 할 때 특히 유용해요.

내장된 파일 기반 구현(FileBasedSegmentWriter)은 들어오는 행을 로컬 디스크에 Avro 레코드로 버퍼링하고 flush()가 호출될 때 Pinot 세그먼트를 만들어요.

SPI 인터페이스 (SPI Interface)

커스텀 세그먼트 라이터를 작성하려면 SegmentWriter 인터페이스를 구현해요:

public interface SegmentWriter extends Closeable {

  void init(TableConfig tableConfig, Schema schema) throws Exception;

  void init(TableConfig tableConfig, Schema schema, Map<String, String> batchConfigOverride)
      throws Exception;

  void collect(GenericRow row) throws Exception;

  default void collect(GenericRow[] rowBatch) throws Exception;

  URI flush() throws Exception;
}

주요 메서드 (Key Methods)

메서드 설명
init(TableConfig, Schema) 테이블 구성과 Pinot 스키마로 라이터를 초기화.
init(TableConfig, Schema, Map) 추가 배치 구성 오버라이드로 초기화.
collect(GenericRow) 단일 행을 버퍼링. flush()가 호출될 때까지 행이 세그먼트에 기록되지 않음.
collect(GenericRow[]) 행 배치를 버퍼링.
flush() 버퍼된 행에서 Pinot 세그먼트를 구축하고 생성된 세그먼트 tar 파일의 URI를 반환. 성공 시 버퍼를 리셋함.
close() 리소스를 해제.

파일 기반 구현 (File-Based Implementation)

FileBasedSegmentWriter는 다음과 같이 동작해요:

  1. 초기화 (Initialization) -- 테이블 구성에서 batchConfigMaps를 읽어요. outputDirURI가 있는 정확히 하나의 BatchConfig 항목을 요구해요.
  2. 버퍼링 (Buffering) -- 각 collect() 호출은 테이블의 변환 파이프라인을 적용하고 결과를 로컬 버퍼 파일에 Avro 레코드로 추가해요.
  3. 플러시 (Flushing) -- flush() 메서드는 버퍼 파일에서 Pinot 세그먼트를 구축하고 .tar.gz로 압축해 구성된 outputDirURI에 쓰고 버퍼를 리셋해요. 플러시가 실패하면 버퍼가 보존되어 flush()를 재시도할 수 있어요.
  4. 닫기 (Closing) -- close() 메서드는 리소스를 해제하고 스테이징 디렉토리를 정리해요.

구성 (Configuration)

세그먼트 라이터는 테이블 구성의 batchConfigMaps를 통해 구성돼요:

{
  "ingestionConfig": {
    "batchIngestionConfig": {
      "segmentIngestionType": "APPEND",
      "batchConfigMaps": [
        {
          "outputDirURI": "/path/to/segment/output",
          "overwrite": "false"
        }
      ]
    }
  }
}
속성 필수 설명
outputDirURI 예 생성된 세그먼트 tar 파일이 기록되는 디렉토리
overwrite 아니요 같은 이름의 세그먼트를 덮어쓸지 여부. 기본값은 false.

사용 예시 (Usage Example)

SegmentWriter writer = new FileBasedSegmentWriter();
writer.init(tableConfig, schema);

for (GenericRow row : rows) {
  writer.collect(row);
}

URI segmentURI = writer.flush();
// segmentURI points to the generated .tar.gz file

writer.close();

커스텀 세그먼트 라이터 작성 (Writing a Custom Segment Writer)

커스텀 세그먼트 라이터를 구현하려면:

  1. SegmentWriter를 구현하는 클래스를 만들어요.
  2. Pinot 플러그인으로 패키징해요 (커스텀 플러그인 작성 참고).
  3. 플러그인 JAR을 Pinot /plugins 디렉토리에 넣어요.

커스텀 구현은 다른 버퍼링 전략(예: 더 작은 데이터셋의 메모리 내 버퍼링)을 사용하거나 원격 저장소에 직접 작성할 수 있어요.

더 알아보기 (Learn more)