Pinot 확장하기

Pinot 확장하기 (Extending Pinot)

Pinot의 내부 확장 지점에 끼워 맞추는 커스텀 코드를 작성해서 Apache Pinot를 확장하는 방법을 다루는 문서예요. 플러그인 시스템이 제공하는 범위를 넘어서는 동작이 필요할 때, 예를 들어 새로운 집계 함수나 커스텀 세그먼트 페처를 추가할 때 이 확장 지점을 사용해요.

출처: 문서

본문

이 섹션은 Pinot의 내부 확장 지점에 끼워 맞추는 커스텀 코드를 작성해서 Apache Pinot를 확장하는 방법을 다뤄요. 플러그인 시스템이 제공하는 범위를 넘어서는 동작, 예를 들어 새로운 집계 함수나 커스텀 세그먼트 페처 추가가 필요할 때 이 확장 지점을 사용해요.

확장할 때 vs 플러그인을 작성할 때 (When to extend vs. when to write a plugin)

Pinot에는 두 가지 수준의 확장성이 있어요:

방법 무엇인가 언제 사용
확장 지점 (이 섹션) Pinot에 컴파일되거나 클래스패스에 로드되는 커스텀 코드. Pinot 핵심 변경이나 팩토리 클래스의 등록이 필요하다. 플러그인 SPI로 제공되지 않는 새 집계 함수, 새 세그먼트 페처 프로토콜, 또는 UDF가 필요하다.
플러그인 (플러그인 아키텍처) 시작 시 /plugins 디렉토리에서 로드되는 자체 포함 JAR. Pinot의 SPI 인터페이스를 사용하며 Pinot 핵심 변경이 필요 없다. 새 입력 형식, 파일 시스템 백엔드, 스트림 커넥터, 메트릭 라이브러리, 또는 플러그인 SPI가 다루는 기타 기능이 필요하다.

사용 사례에 맞는 플러그인 SPI가 있다면 플러그인 접근 방식을 선호해요. Pinot 소스 코드 수정이 필요 없고 업그레이드에 걸쳐 유지보수가 더 쉽기 때문이에요. 플러그인 SPI가 요구 사항을 다루지 않을 때만 확장 지점 접근 방식을 사용해요.

사용 가능한 확장 지점 (Available extension points)

커스텀 집계 함수 (Custom aggregation functions)

Pinot는 내장 집계 함수(MIN, MAX, SUM, AVG 등)와 함께 제공되지만, AggregationFunction 인터페이스를 구현하고 AggregationFunctionFactory에 등록해서 직접 함수를 추가할 수 있어요.

커스텀 집계 함수는 세 가지 쿼리 단계를 처리해야 해요:

  1. Map -- 개별 세그먼트를 처리하고 부분 결과 누적
  2. Combine -- 같은 서버의 세그먼트에서 부분 결과 병합
  3. Reduce -- 서버 간 결과를 병합하고 최종 값 추출

전체 인터페이스, 메서드별 둘러보기, 코드 포인터는 커스텀 집계 함수 작성을 보세요.

세그먼트 페처 (Segment fetchers)

세그먼트가 외부 시스템(Hadoop, Spark, Flink)에서 생성되면 Pinot가 쓰여진 위치에서 가져와야 해요. Pinot는 기본적으로 HTTP/HTTPS와 NFS를 지원해요. 세그먼트가 HDFS, S3, 또는 다른 저장소 시스템에 있다면 내장 페처를 구성하거나 커스텀 프로토콜용 SegmentFetcher 인터페이스를 구현할 수 있어요.

HDFS 구성, 커스텀 페처 구현, 푸시 예시는 세그먼트 페처를 보세요.

스칼라 함수와 UDF (Scalar functions and UDFs)

Pinot는 SQL 쿼리에서 사용할 수 있는 사용자 정의 스칼라 함수(UDF)를 지원해요. 스칼라 함수는 @ScalarFunction으로 어노테이션되며 클래스패스를 통해 자동으로 등록돼요. 집계 함수와 달리 스칼라 함수는 행 단위로 동작하며 병합 로직이 필요 없어요.

내장 예시는 Pinot ScalarFunction 소스 코드를 보세요.

변환 함수 (Transform functions)

변환 함수는 쿼리 실행 중에 실행되어 파생 값을 즉석에서 계산해요. TransformFunction 인터페이스를 구현하고 TransformFunctionFactory에 등록돼요. UDF로 표현할 수 없는 서버 측 계산이 필요할 때 커스텀 변환 함수가 유용해요.

사전 요구 사항 (Prerequisites)

Pinot를 확장하기 전에 다음을 갖추어야 해요:

더 알아보기 (Learn more)