세그먼트 라이터 플러그인
세그먼트 라이터 플러그인 (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는 다음과 같이 동작해요:
- 초기화 (Initialization) -- 테이블 구성에서
batchConfigMaps를 읽어요.outputDirURI가 있는 정확히 하나의BatchConfig항목을 요구해요. - 버퍼링 (Buffering) -- 각
collect()호출은 테이블의 변환 파이프라인을 적용하고 결과를 로컬 버퍼 파일에 Avro 레코드로 추가해요. - 플러시 (Flushing) --
flush()메서드는 버퍼 파일에서 Pinot 세그먼트를 구축하고.tar.gz로 압축해 구성된outputDirURI에 쓰고 버퍼를 리셋해요. 플러시가 실패하면 버퍼가 보존되어flush()를 재시도할 수 있어요. - 닫기 (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)
커스텀 세그먼트 라이터를 구현하려면:
SegmentWriter를 구현하는 클래스를 만들어요.- Pinot 플러그인으로 패키징해요 (커스텀 플러그인 작성 참고).
- 플러그인 JAR을 Pinot
/plugins디렉토리에 넣어요.
커스텀 구현은 다른 버퍼링 전략(예: 더 작은 데이터셋의 메모리 내 버퍼링)을 사용하거나 원격 저장소에 직접 작성할 수 있어요.