시계열 언어 플러그인

시계열 언어 플러그인 (Time Series Language Plugin)

PromQL, M3QL 같은 커스텀 또는 새로운 시계열 쿼리 언어를 지원하는 방법을 다루는 문서예요.

출처: 문서

본문

PromQL 같은 시계열 쿼리 언어는 할 수 있는 일이 제한적이지만 시계열 분석에는 상당히 편리해요. 많은 시계열 쿼리 언어가 있으며, Pinot는 시계열 언어 플러그인을 통해 그 중 어떤 것이든 지원할 수 있어야 해요.

플러그인 높은 수준 설계 (Plugin High Level Design)

시계열 플러그인 구현 전용 SPI가 있어요: pinot-timeseries-spi.

자체 언어 지원을 구축하려면 다음 핵심 컴포넌트를 구현해야 해요:

  • TimeSeriesLogicalPlanner는 시계열 요청을 받아 BaseTimeSeriesPlanNode로 구성된 플랜 트리를 반환해야 해요. 플랜 트리의 리프는 LeafTimeSeriesPlanNode여야 해요. 플래너는 적합하다고 판단하는 대로 TimeBuckets를 정의할 수도 있어요.
  • BaseTimeSeriesPlanNode는 자체 플랜 노드를 구현하게 해줘요. 각 플랜 노드는 run 메서드를 통해 BaseTimeSeriesOperator를 반환해야 해요.
  • BaseTimeSeriesOperator는 운영자를 정의·구현하게 해줘요.
  • BaseTimeSeriesBuilder는 지원할 각 집계 타입별로 구현할 수 있어요.

apache/pinot 저장소의 pinot-plugins/pinot-timeseries-lang에 예시 플러그인 구현이 있어요.

플러그인 구현 팁 (Plugin Implementation Tips)

  • 쿼리 파서 구현에는 JavaCC 같은 프레임워크를 고려해 보세요.
  • 플래너에서 반환하는 TimeBuckets는 원래 요청의 [start, end]를 넘어 흘러넘칠 수 있어요. 언어의 의미론에 따라 해상도를 정의할 수도 있어요.
  • TimeBuckets의 해상도를 현명하게 고르세요. 매우 미세한 해상도를 설정하면 시각화 도구가 느려지거나 Pinot에 많은 힙을 유발할 수 있어요.
  • LeafTimeSeriesPlanNode의 limit을 사용해 리프 스테이지에서 반환할 수 있는 최대 계열 수를 제어해요.
  • 리프 운영자가 반환하는 각 계열마다 TimeBuckets#getTimeBuckets() 길이와 같은 길이의 Double[] 배열이 있다는 점에 유의하세요. 이상적으로는 허용하고 싶은 데이터 포인트 수의 고정된 상한을 기준으로 limit과 TimeBuckets의 해상도를 튜닝해야 해요.

더 알아보기 (Learn more)