1.4.0

1.4.0

Apache Pinot 1.4.0 릴리스 노트 문서예요. 이 릴리스는 Multistage 엔진, Pauseless Consumption, 시계열 엔진, Logical Table 지원, Upsert와 중복 제거 강화, Minion 작업(smallSegmentMerger 포함), 리밸런싱 능력에 상당한 개선을 제공해요. 또한 수많은 작은 기능과 일반 버그 수정을 포함해요.

출처: 문서

본문

Multistage 엔진 라이트 모드 (Beta) | Runbook

Pinot에 대한 Multistage 엔진 쿼리 실행을 위한 완전히 새로운 쿼리 모드가 추가됐어요. Uber의 Presto over Pinot 쿼리 아키텍처에서 크게 영감을 받았어요.

MSE Lite Mode는 Pinot의 V1 쿼리 엔진과 같은 Scatter-Gather 패러다임으로 쿼리를 실행해요. 또한 leaf stage의 각 인스턴스가 반환하는 레코드 수에 구성 가능한 제한을 추가해요. 이 제한은 기본적으로 100k 레코드로 설정돼요.

MSE Lite Mode로 생산 워크로드를 깨뜨릴 걱정 없이 모든 사용자에게 MSE 접근을 활성화할 수 있어요. 또한 MSE Lite Mode는 최소 하드웨어로 수천 QPS로 확장할 수 있어, 사용자가 하위 쿼리, window 함수 등의 기능을 활용하는 복잡한 multi-stage 쿼리를 최소한의 신뢰성 위험으로 높은 qps와 낮은 지연으로 실행할 수 있게 해요.

다음 쿼리 옵션을 모두 설정해 활성화할 수 있어요:

SET useMultistageEngine=true;
SET usePhysicalOptimizer=true;
SET useLiteMode=true;

Multistage 엔진 물리 최적화기 (Beta) | Runbook

Multistage 엔진용 새 쿼리 최적화기를 추가했어요. 이 최적화기는 중복된 Exchange를 자동으로 제거하거나 단순화할 수 있어요. 향후 버전에서 이 쿼리 최적화기를 기본값으로 만들 계획이에요.

Uber가 이 최적화기를 Colocated Join 지원이 필요한 워크로드에 채택했고, 5-7배 더 빠르고 CPU 50%를 덜 사용하는 것으로 입증됐어요. issue #15871

활성화하려면 쿼리 옵션을 설정하세요:

SET useMultistageEngine=true;
SET usePhysicalOptimizer=true;

기능

  • 임의의 복잡한 쿼리의 Exchange 단순화 가능. 쿼리 힌트 불필요.
  • group-by, joins, union-all 등 지원.
  • Broker 자체 내에서 상수 쿼리 해결 가능.
  • 두 조인 입력의 파티션 수가 달라도 Exchange 단순화 가능. 예: 왼쪽 테이블이 4개 서버에 걸쳐 8개 파티션으로 파티셔닝되고, 오른쪽 테이블이 4개 서버에 걸쳐 16개 파티션으로 파티셔닝된 경우, 물리 최적화기는 자동으로 "Identity Exchanges"로 전환.
  • 조인 양쪽에 선택된 서버가 달라도 Exchange 단순화 가능.

지원하지 않지만 곧 제공될 예정

  • SET stageParallelism=x로 쿼리 병렬 처리 커스터마이징 지원.
  • Semi-Join 쿼리의 동적 필터 지원.
  • 적격 쿼리의 SubPlan 기반 실행 지원.
  • "Lookup Join" 최적화 지원.
  • Spools 지원.

이 기능의 일부로 병합된 주요 PR들

  • [multistage] LogicalTableScan을 PinotLogicalTableScan으로 교체 #15225
  • [multistage] 물리 최적화의 기본 구조 추가 #15371
  • [multistage] 물리 계획 노드 / 특성 할당 / 논리적 Agg 규칙 추가 #15439
  • [multistage] Leaf Stage 워커 할당 / 경계 / Agg 규칙 추가 #15481
  • [multistage] Pushdown 및 워커 규칙 추가 #15658
  • [multistage] 물리 최적화기 E2E 지원 #15698
  • [multistage] Multistage 엔진 라이트 모드 (prototype) #15743
  • [multistage] 잘못된 세그먼트 파티션 id 추론 지원 추가 #15760
  • [multistage] MSE 물리 최적화기에서 제외된 새 세그먼트 처리 #15780
  • [multistage] Colocated Join Quickstart에 userFactEvents 테이블 추가 #15800
  • [multistage] Broker Server/Segment 가지치기 지원 추가 #15959
  • [multistage] Scatter Gather 실행의 Lite Mode #16000
  • [multistage] inferRealtimeSegmentPartition 지원 추가 #16023
  • [multistage] 기본적으로 runInBroker / useBrokerPruning 활성화 #16204
  • [multistage] 물리 최적화기의 Values 지원 추가 #16221
  • [multistage] 물리 최적화기와 라이트 모드의 broker 구성 기본값 추가 #16240
  • [multistage] V2 최적화기에 해시 함수 우아한 지원 #16296
  • [multistage] SetOp 처리와 다중 컬럼 조인의 버그 수정 #16330

Multistage 엔진 개선

MSE의 여러 Window 함수 #16109

multi-stage 엔진이 이제 단일 쿼리 계획에서 여러 WINDOW 함수를 지원해, 개선된 stage 융합과 실행 계획으로 더 표현력 있고 효율적인 분석 쿼리를 가능하게 해요.

ASOF JOIN 지원 #15630

시계열 분석에서 흔히 사용되는 시간 정렬 조인을 가능하게 하는 ASOF JOIN 지원을 도입했어요. 이는 시간 근접성에 기반한 근사 일치가 필요한 사용 사례를 풀어줘요.

서로 다른 파티션의 Colocated Join #15764

MSE 엔진이 이제 서로 다른 파티셔닝 스킴을 가진 테이블 간의 colocated join을 지원해, 조인 유연성과 실제 데이터 레이아웃과의 호환성을 개선해요.

Local Replicated Join & Local Exchange 병렬 처리 #14893

로컬 복제 조인과 로컬 교환을 활성화해 조인 전략을 최적화해요. 이는 노드 간 셔플을 줄이고 high-selectivity 조인과 동일 파티션 데이터의 성능을 개선해요.

Broadcast Join의 분배 타입 힌트 #14797

적절할 때 broadcast join을 강제하기 위해 분배 타입(예: BROADCAST)을 지정하는 플래너 힌트를 도입했어요. 이는 조인 전략과 실행 계획을 더 잘 제어하게 해줘요.

최적화기의 동적 규칙 토글 #15999

사용자가 쿼리 플래너(optProgram)의 최적화 규칙을 동적으로 활성화/비활성화할 수 있게 됐어요. 쿼리 동작과 디버깅에 대한 세밀한 제어와 더 쉬운 튜닝을 가능하게 해요.

타입 별칭의 파서 개선 #15615

LONG이 BIGINT로 해석되는 것 같은 SQL 타입 별칭 지원을 추가해 호환성과 개발자 편의성을 개선했어요.

힙 사용량 기반 태스크 스로틀링 #16271

Segment Split Executor(SSE)와 Multi-Stage Execution(MSE) 태스크에 스로틀링 로직을 도입했어요. 서버 힙 사용량이 구성 가능한 임계값을 초과하면 태스크가 스로틀링되어 부하 상태에서 시스템 안정성을 보호해요.

클라이언트 제공 ID로 MSQE 쿼리 취소 #14823

Multi-Stage 쿼리 엔진(MSQE)의 쿼리 취소 지원을 확장했어요. 클라이언트가 지정한 쿼리 식별자를 통한 취소를 포함해요. 이는 외부 시스템과의 더 나은 통합과 장기 실행 쿼리에 대한 더 견고한 제어를 가능하게 해요.

Pauseless Consumption (설계)

Pauseless consumption은 Pinot 1.4.0에서 도입됐어요. 수집 지연을 최소화하고 Apache Pinot의 데이터 신선도를 개선해 실시간 분석을 강화해요.

Apache Pinot의 현재 아키텍처에서는 이전 세그먼트의 빌드 및 업로드 단계 동안 실시간 데이터 수집이 일시 중지돼요. 이 단계는 완료하는 데 몇 분이 걸릴 수 있어 데이터 가용성에 지연이 생겨요. 결과적으로 사용자는 가장 최근 데이터 접근에 공백을 겪고, 실시간 분석 능력에 영향을 미쳐요.

Pauseless consumption은 이전 세그먼트의 빌드·업로드 단계를 완료하면서 Pinot이 데이터를 계속 수집하도록 허용해 이 문제를 해결해요. 이 강화는 더 최신 데이터 가용성을 보장하고 수집과 쿼리 사이의 지연을 크게 줄여요.

이 기능의 일부로 병합된 주요 PR들

  • 실패 시나리오 없는 Pauseless ingestion #14741
  • Pauseless Ingestion #2: DR 없이 실패 시나리오 처리 #14798
  • Pauseless Consumption #3: 재수집을 통한 재해 복구 #14920
  • Pauseless 테이블 검증 추가 #15567, #15953
  • Pauseless의 재해 복구 모드 추가 #16071
  • pauseless 관측성 메트릭 추가 #15384
  • Pauseless Dedup 및 Upsert 테이블 호환성 #15383
  • pauseless 테이블의 빌드 중 세그먼트 삭제 허용 #15299
  • pauseless consumption의 크기 기반 임계값 지원 #15347
  • pauseless consumption 세그먼트 다운로드 수정 #15316
  • 기본적으로 pauseless FSM 등록 및 pauseless 활성 테이블에 이 FSM 선택 #15241

Logical Table 지원 (설계)

Logical table은 물리 테이블(REALTIME과 OFFLINE 테이블)의 집합이에요. Logical table을 사용하는 SQL 쿼리는 내부적으로 모든 물리 테이블을 스캔해요. 개념적으로 logical table은 관계형 데이터베이스의 특정 VIEW 정의와 유사해요.

Logical table 'l' of physical tables t1_REALTIME, t2_REALTIME, t1_OFFLINE is similar to

CREATE VIEW l AS
SELECT <columns> FROM t1_REALTIME
UNION
SELECT <columns> FROM t2_REALTIME
UNION
SELECT <columns> FROM t1_OFFLINE

Logical table은 여러 물리 테이블을 관리하는 복잡성을 추상화해 광범위한 사용 사례를 단순화하고 통합하도록 설계됐어요. 큰 테이블을 더 작은 OFFLINE 테이블들과 REALTIME 테이블로 분할해 ZK 노드 확장성을 가능하게 하면서 사용자에게는 단일 logical table을 제공해 IdealState, ExternalView, 세그먼트에 대한 연산을 투명하게 만들어요. Logical table은 또한 Kafka topic 재구성, 스키마 변경, 테이블 이름 변경 같은 ALTER TABLE 워크플로를 지원하며, 밑에 있는 물리 테이블 목록의 교체를 허용해요. 재스트리밍·시간 기반 파티셔닝 같은 데이터 레이아웃 관리에서 logical table은 수집 변경이 사용자에게 보이지 않게 유지되도록 도와요.

이 기능의 일부로 병합된 주요 PR들

  • Logical table: 빠른 리팩터링과 java docs #15770
  • logical tables의 build routing 제거 처리 #15862
  • SSE에서 Logical Tables에 쿼리 실행 #15634
  • Logical table 시간 경계 #15776
  • logical tables에 구성 추가 #15720
  • Logical table CRUD 연산 #15515
  • logical table의 데이터베이스 이름 검증 #15994
  • 서버의 logical table 컨텍스트 구성 캐시 #15881
  • logical table ref 테이블 이름으로 검증하는 스키마·테이블 구성 삭제 #15900
  • Logical table 스키마 강제 #15733
  • logical tables의 Broker 선택 #15726
  • GET /logicalTables API가 데이터베이스별 테이블을 반환하도록 #15944
  • Logical table 쿼리 할당량 적용 - SSE #15839
  • MSE에서 logical tables 지원 #15773

시계열 엔진이 이제 베타 (Time Series Engine is Now in Beta)

Pinot 1.3.0이 Apache Pinot에 Generic Time Series Query Engine을 도입했어요. 플러그 가능한 프레임워크를 통해 다양한 시계열 쿼리 언어(예: PromQL, M3QL)의 네이티브 지원을 가능하게 해요. 1.4.0에서 여러 강화와 버그 수정이 추가됐어요.

Pinot Controller의 Timeseries Query 실행 UI #16305

Pinot Controller에 전용 Time Series Query 페이지를 추가했어요. UI는 운영자가 컨트롤러의 /timeseries/api/v1/query_range 프록시로 M3QL 쿼리를 실행하고, 쿼리 시간 범위와 타임아웃을 설정하고, 원시 JSON 응답을 컨트롤러에서 직접 검사할 수 있게 해요.

timeseries API 접근용 controller 엔드포인트 추가 #16286

Pinot에서 시계열 쿼리를 지원하기 위해 Prometheus 호환 /query_range 엔드포인트를 도입해요. GET과 POST 메서드를 모두 지원하도록 broker 요청 처리를 리팩터링하고, 헤더 추출을 단순화하며, 오류 처리와 로깅을 개선해요. 유지보수성을 위한 사소한 코드 정리와 강화도 포함해요.

개선

  • [timeseries] Leaf Stage에 원시 시간 값 전달 지원 추가 #15000
  • [timeseries] Num Groups Limit 기본값 수정 #15026
  • [timeseries] limit와 numGroupsLimit 지원 추가 #14945
  • [timeseries] Time Series Query Planner에 Metadata Provider 추가 #15604
  • [timeseries] TimeSeriesEngineAuth용 작동 중인 E2E quickstart 추가 #16169

Upsert와 Dedup (중복 제거)

레플리카 간 일관된 생성 시간 보장으로 upsert 데이터 불일치 방지 #16034

UploadedRealtimeSegment 업로드 중 레플리카 간 불일치한 세그먼트 생성 시간이 비결정적 upsert 동작을 초래해 데이터 불일치로 이어지는 문제를 해결하는 강화. 해결책은 SegmentMetadataImpl에 zkCreationTime을 추가하고 이를 비교 동점 해소 로직에 사용하는 것. 세그먼트 로딩 시 모든 로딩 플로우에서 ZK 시간이 설정되고, upsert 로직은 ZK 시간을 선호하는 getAuthoritativeCreationTime()를 도입해 모든 레플리카에서 일관된 upsert 결정을 보장하면서, ZK 시간을 사용할 수 없으면 로컬 시간으로 폴백해 이전 버전 호환성을 유지해요.

버그 수정

  • 기능 활성화를 제어하기 위해 ENABLE, DISABLE, DEFAULT 값을 가진 Enablement enum 도입. DEFAULT 활성화의 경우 상위 수준(예: 인스턴스 수준)의 기본 구성을 사용
  • UpsertConfig와 DedupConfig에 snapshot과 preload 필드를 Enablement로 도입해 값이 제대로 오버라이드되도록 함. 현재 인스턴스 수준이 활성화되면 테이블 수준에서 비활성화할 방법이 없음
  • 서버 수준 오버라이드와 구성 변경의 불일치를 피하기 위해 항상 UpsertContext와 DedupContext에서 속성 읽기

정리 (Cleanups)

  • upsert/dedup 관련 구성의 생성자 단순화
  • 가독성을 위해 일부 필드/메서드 순서 변경
  • upsert/dedup의 메타데이터 매니저 생성 로직 통합
  • 일부 상수를 CommonConstants로 이동

비호환성 (Incompatibility)

  • enableSnapshot과 enablePreload가 폐기되고 snapshot과 preload로 대체됨

주요 PR

  • dedup/partial-upsert의 빌드 중 consumption 허용 #15296
  • upsert 테이블 파티션 mgr의 snapshotRWlock 제거 #15420
  • upsert/dedup, BIG_DECIMAL, JSON의 MV 기본 키 검증·거부 #16079
  • validDocIdsMetadata에 segmentCreationTimeMillis 추가 #15938
  • Upsert & Dedup 테이블의 timeColumn 데이터 타입 확인 #15761
  • validDocIds info API에 서버 상태 추가 - Upsert Tables #16165
  • SegmentOperationsThrottler를 더 확장 가능하게 만들고 upsert와 Dedup의 인터페이스를 이 인자를 받도록 수정 #15973
  • Bug Fix: TTL과 RF > 1을 사용하는 Dedup 테이블의 세그먼트가 BAD 상태로 가는 문제 수정 #15178
  • 세그먼트 다운로드·교체 중 활성화된 Dedup 테이블의 consumption 허용 안 함 #15268
  • 비기본 tier 세그먼트의 dedup 메타데이터 업데이트 건너뛰기 구성 추가 #15576
  • upsert와 dedup 구성 수정·정리 #15528
  • RealtimeSegmentValidationManager가 partial upsert와 dedup 테이블의 오류 세그먼트를 수정하도록 허용 #15987

Minion 개선

Small Segment Merger 태스크 강화 #16086

세그먼트 레플리카 생성 시간 불일치로 인한 UpsertCompactMerge 태스크의 데이터 불일치 문제를 해결하는 강화. 서버의 생성 시간 대신 upsert 동점 해소 로직과 일치하는 ZK 메타데이터의 생성 시간을 사용하도록 변경. 태스크 생성기는 추가 서버 호출 없이 레플리카 간 결정적 세그먼트 메타데이터를 보장하기 위해 병합하는 세그먼트의 최대 생성 시간을 태스크 입력으로 전달.

비기본 tier의 dedup 메타데이터 업데이트 건너뛰기 구성 추가 #15576

dedup 활성 테이블의 경우 세그먼트가 콜드 tier로 이동하면 보통 메타데이터 TTL 밖이므로, dedup 메타데이터 업데이트를 건너뛰어 메타데이터 구성 오버헤드를 줄일 수 있음.

새로 추가된 구성:

  • dedupConfig 아래 테이블 수준: ignoreNonDefaultTiers: ENABLE, DISABLE, DEFAULT(기본값, 인스턴스 수준 구성 사용)
  • 인스턴스 수준: pinot.server.instance.dedup,default.ignore.non.default.tiers

주요 개선 및 버그 수정

  • 업로드된 세그먼트의 세그먼트 완료 FSM 수정 #15062
  • minion 태스크를 트리거한 행위자 추적 #14829
  • minion 인스턴스 태그 확인 검증 개선 #15239
  • Minion 태스크가 문제 있는 consuming 세그먼트를 집지 않도록 #15173
  • minion 내장 태스크의 태스크 구성 로깅용 Obfuscator 추가 #16192

수집과 인덱싱

Multi-column Text 인덱스 추가 #16103

여러 컬럼에 걸쳐 단일 텍스트 인덱스를 만드는 능력을 도입했어요. 이는 다중 필드 텍스트 검색의 인덱싱 오버헤드를 줄이고 텍스트 관련성이 여러 필드에 걸치는 더 빠른 검색 쿼리를 가능하게 해요.

Lucene 내 공유 intra-column 토큰 공간 절약 외에도 새 인덱스는 단일 문서 id 매핑을 사용해요. 예시 구성(테이블 구성 내):

"tableIndexConfig": {
   "multiColumnTextIndexConfig": {
      "columns": ["hobbies", "skills", "titles" ],
      "properties": {
         "caseSensitive": "false"
       }
       "perColumnProperties": {
          "titles": {
             "caseSensitive": "true"
          }
       }
 }

위 예시에서 보듯, 인덱스 구성은 다음 둘 다를 허용해요:

  • 모든 컬럼에 적용되는 공유 인덱스 속성을 "properties"로 설정. 허용 키: enableQueryCacheForTextIndex, luceneUseCompoundFile, luceneMaxBufferSizeMB, reuseMutableIndex 및 perColumnProperties에 허용된 모든 것.
  • perColumnProperties로 컬럼별 속성(공유 속성 오버라이드) 설정. 허용 키: useANDForMultiTermTextIndexQueries, enablePrefixSuffixMatchingInPhraseQueries, stopWordInclude, stopWordExclude, caseSensitive, luceneAnalyzerClass, luceneAnalyzerClassArgs, luceneAnalyzerClassArgTypes, luceneQueryParserClass.

Max JSON Index Heap 사용량 구성 #15685

수집 중 메모리 사용을 캡핑하기 위해 mutable JSON 인덱스의 maxBytesSize 구성을 도입했어요. 큰 JSON 문서 처리 시 과도한 힙 소비를 방지해요.

Avro의 Logical Type 지원 기본 활성화 #15654

pinot-avro 수집 플러그인이 이제 timestamp와 decimal 같은 Avro logical type 지원을 자동으로 활성화해요. 스키마 정확도를 개선하고 수동 구성의 필요성을 줄여요.

실시간 세그먼트 다운로드 수정 #15316

수집 중 실시간 테이블 세그먼트 다운로드 실패를 일으키는 문제를 해결했어요. 이 수정은 데이터 가용성을 개선하고 수집 오류를 줄여요.

JSON Confluent Schema Registry 디코더 #15273

Confluent Schema Registry에 등록된 JSON 메시지의 원활한 수집을 가능하게 하는 KafkaConfluentSchemaRegistryJsonMessageDecoder를 추가했어요. 이는 Kafka 기반 파이프라인과의 호환성을 넓혀요.

수집 중 BigDecimal 값 표준화 #14958

값을 표준 형태로 변환해 BigDecimal 수집을 표준화했어요. 일관된 중복 제거, 정확한 비교, 안정적인 upsert 동작을 보장해요.

새 스칼라 함수 지원

JSON_MATCH 함수 확장 지점 #15508

JSON_MATCH 함수의 확장 지점을 추가해 개발자가 JSON 쿼리 평가 중 커스텀 매칭 로직을 꽂을 수 있게 해요.

JsonKeyValueArrayToMap 함수 #15352

JSON 키-값 배열을 맵으로 변환하는 함수를 도입해 특정 ETL과 쿼리 변환을 단순화해요.

H3 지리공간 함수: gridDisk와 gridDistance #15349, #15259

H3 인덱싱용 새 지리공간 함수 추가:

  • gridDisk — 주어진 반경 내의 모든 H3 셀 반환.
  • gridDistance — 두 H3 셀 사이의 거리 계산.

플러그인 & API 강화

ArrowResponseEncoder 구현 #15410

Apache Arrow 형식 응답을 지원하는 새 ArrowResponseEncoder를 추가해 호환 클라이언트로 더 빠르고 효율적인 데이터 전송을 가능하게 해요.

S3 플러그인 체크섬 지원 #15304

S3 플러그인이 이제 구성을 통한 요청·응답 체크섬 검증을 지원해요. S3에 읽거나 쓸 때 데이터 무결성 검증을 개선해요.

보안

행 수준 보안(RLS) 지원 #16043

다른 사용자나 그룹이 자신이 권한이 있는 행만 볼 수 있게 하는 세밀한 데이터 접근 제어가 가능한 행 수준 보안 정책을 구현했어요. 특히 멀티테넌트 환경에 유용해요.

Groovy 스크립트 정적 분석 #14844

실행 전에 안전하지 않은 패턴을 감지하는 Groovy 스크립트 정적 분석 검사를 추가해, 커스텀 UDF와 변환의 보안 태세를 개선해요.

주요 기능과 업데이트

커스터마이즈 가능한 라우팅 전략용 orderedPreferredReplicas 쿼리 옵션 지원 #15203

orderedPreferredPools 쿼리 옵션을 도입해 사용자가 우선순위가 있는 서버 풀 목록을 라우팅 힌트로 제공할 수 있게 해요. 브로커는 이 풀들에 순서대로 쿼리를 라우팅하려 시도하고 우아하게 폴백해, 카나리 배포의 정밀한 트래픽 제어를 가능하게 해요.

모든 테이블에 스키마 강제 #15333

이제 모든 테이블이 연관 스키마를 가지도록 강제해, 수집과 쿼리 실행 전반의 데이터 무결성과 일관성을 보장해요.

기본 로드 모드를 MMAP으로 변경 #15089

특히 대용량 데이터셋에서 더 나은 메모리 효율성을 위해 기본 세그먼트 로드 모드를 MMAP으로 업데이트했어요.

쿼리 리소스 격리용 워크로드 구성 #15109

워크로드 기반 쿼리 리소스 격리를 도입했어요. 관리자가 특정 리소스 할당을 가진 워크로드 프로파일을 정의할 수 있어 멀티테넌트 공정성을 개선해요.

리밸런스의 서버 수준 세그먼트 일괄 처리 #15617

리밸런스 연산 중 서버 수준에서 세그먼트 할당을 일괄 처리하는 기능을 추가했어요. 리밸런스 단계 수를 줄이고 중단을 최소화해요.

ClusterConfigChangeHandler와 세그먼트 재인덱스 스로틀 #14894

서버에 ClusterConfigChangeHandler를 도입하고 세그먼트 재인덱싱 연산의 스로틀링을 추가했어요. 클러스터 구성 변경 중 과도한 부하를 방지해요.

기타 개선

  • TableRebalance의 dry-run 요약 모드 추가 — dry-run 결과 요약만 반환 #15050
  • SchemaConformingTransformer에 mergedTextIndexPrefixToExclude 구성 추가 #15542
  • broker grpc 쿼리 엔드포인트와 BrokerRequest/BrokerResponse protobuf 추가 #15081
  • 스레드 리소스 사용 샘플링 시 null 확인 추가 #15069
  • 리소스 활용 기반 수집 일시 중지·재개 지원 추가 #15008
  • TableRebalance 사전 확인 수행 지원 추가 #15029
  • 서버 수준 동적 구성 가능 세그먼트 다운로드 스로틀러 추가 #15001
  • [Build] Maven Wrapper 추가 + Docker 이미지의 Maven 버전 증가 #15035
  • 테이블 생성 후 kafka 파티션이 줄어든 테이블 테스트 케이스 추가 #15028
  • java opts에 jute.maxBuffer 예시 추가 #15047
  • committing 세그먼트를 캡처하는 propertystore의 새 목록 추가 #15016
  • is_enable_group_trim 힌트의 기본값이 있는 broker 구성 추가 #14990
  • ZK 클러스터 구성으로 구성 가능한 세그먼트 StarTree 인덱스 재빌드 스로틀러 추가 #14943
  • 테이블 IndexingConfig에 새 구성 skipSegmentPreprocess 추가 #14982
  • http 클라이언트/요청 타임아웃 커스터마이즈 구성 추가 #15010
  • 테이블과 스키마 즉시 삭제 옵션 추가 #14736
  • 중복 노드 추가 방지와 플로우차트 생성의 에지 연결 개선으로 쿼리 시각화 강화 #15025
  • numGroupsWarningLimitReached stat 추가 #15279
  • boolean 컬럼에 bloomfilter 추가 차단하도록 인덱스·필드 구성 검증 강화 #15283
  • MSE의 시작·완료 태스크 수를 추적하는 MetricsExecutor 추가 #15357
  • precheckcontext의 getter 추가 #15339
  • [HELM]: initContainers 지원 추가 #15275
  • multistage num groups limit 도달 메트릭 추가 #15221
  • 테이블 리밸런스 구성의 권장 기본값 추가, RebalanceTableCommand에 preChecks 추가 #15232
  • Ui: 필수 nodejs 버전 사용 지침 추가 #15181
  • 서비스에서 zookeeper 최대 버퍼 크기 추적 메트릭 추가 #15380
  • 세그먼트 연산 스로틀 임계값과 연산 중 세그먼트 수 추적 메트릭 추가 #15392
  • BrokerGrpcServer에 인코딩 타입 추가 #15395
  • 순서대로 consumption 확인 로그 추가 #15408
  • SecretStore용 인터페이스 추가 #15226
  • Rebalance API 요약에 Tenants Info 추가 #15284
  • ForwardIndexReader에 문자열 값 읽기 기본 구현 추가 #15391
  • off-heap set 구현 추가 #15205
  • 스트리밍 응답 가져오기 엔드포인트용 BrokerGrpcServer 추가 #15088
  • HELM: TLS 전용 지원 추가 및 0.3.3 차트 버전 게시 #15356
  • 연속 모드에서 구성 가능한 JFR 레코딩 생성 새 구성 추가 #15364
  • Semaphore를 consumer 잠금으로 사용하는 이유에 대한 주석 추가 #15361
  • external view의 노드 크기 추적 메트릭 추가 #15338
  • 테이블의 get IS 및 EV API에 선택적 매개변수 segmentNames 추가 #15332
  • Rebalance API에 Disk Utilization 정보 추가 #15175
  • DATE_TRUNC 최적화기 추가 #14385
  • 고아 세그먼트 정리 지원 추가 #15142
  • multi-stage 엔진의 lookup join 통합 테스트 추가 #15244
  • Murmur 파티션 함수의 별칭으로 Murmur2 추가 #15298
  • FunnelBaseAggregationFunction에 sample과 check 추가 #15251
  • Rebalance API에 minimizeDataMovement 추가 #15110
  • DUAL과 알 수 없는 테이블이 있는 비호환 DUAL 테스트 추가 #15260
  • ARRAY_LENGTH용 다형성 스칼라 함수 구현 추가 #15243
  • SAR-635 - readme에 YouTube 기여 추가 #15235
  • Pinot에 predownload 기능 추가 #14686
  • 추정 MSE 쿼리 서버 스레드용 broker gauge 메트릭 추가 #15189
  • 최적화기의 각 규칙 평가 시간을 보고하는 plan listener 추가 #15192
  • pinot-kinesis용 fetchPartitionCount와 fetchStreamPartitionOffset 구현 api 추가 #14713
  • CONSUMING/ONLINE에서 DROPPED로 직접 상태 전환 추가, DROPPED와 OFFLINE의 상태 전환 우선순위 증가 #15190
  • QueryRoutingTest에 서버 채널 종료 단언 추가 #15165
  • multi-stage 엔진에서 TIMESTAMP / LONG의 타입 강제(암시적 cast) 규칙 추가 #15679
  • Thrift와 Proto broker/server 메시지에 TableSegmentsInfo 추가 #15573
  • 스칼라 함수에 CityHash 지원 추가 #15655
  • SegmentDeletionManager의 리소스 삭제 호출에 타임아웃 추가 #15638
  • Table UI에 Pause/Resume consumption 버튼 추가 #15657
  • Pinot UI의 Add table 버튼에 원시 JSON 입력 허용 #15647
  • grpc query/broker 서버용 netty 메모리 관련 메트릭 추가 #15625
  • GrpcMailboxServer용 netty 메모리 관련 메트릭 추가 #15651
  • 테이블 UI에서 바로 consuming 세그먼트 정보를 보는 버튼 추가 #15623
  • Replica Groups Info에 대한 새 사전 확인 항목 추가 #15575
  • RealtimeSegmentValidationManager 트리거로 실시간 테이블 복구 버튼 추가 #15584
  • 서비스 스타터에 커스텀 클러스터·인스턴스 구성 적용 훅 추가 #15595
  • IdealState 업데이트 실패 시 rebalance 진행 통계 롤백 지원 추가 #15510
  • thrift 바이너리 경로 매개변수 추가 #15546
  • MV 집계 함수 - COUNT, MIN, MAX, SUM, AVG, MINMAXRANGE의 null 처리 지원 추가 #15524
  • base64 인코딩 문자열 감지기의 한계를 명확히 하는 테스트 추가 #15497
  • codecov token 추가 #15493
  • controller에서 auth 활성 broker 엔드포인트 쿼리 시 auth 정보 추가 #15486
  • DISTINCT_COUNT_OFF_HEAP 집계 함수 추가 #15469
  • pinot-tools QueryRunner의 QuerySummary에 per query 통계 추가 #15376
  • 복합 변환 전에 레코드 강화자 적용 지원 추가 #15359
  • with childOption 추가 #15628
  • [Minor] 모든 상수를 공개 접근으로 #15605
  • add_init #15471
  • 정수 우선순위로 플러그인 오버라이드 능력 추가 #15766
  • 새로 추가된 컬럼에 star-tree 생성 테스트 추가 #15745
  • 서버의 쿼리당 메모리 할당 통계 추가 #15828
  • 기본적으로 japicmp 비활성화. 그냥 실행하는 CI 실행 추가 #15888
  • 가상 DataSource 지원 준비로 IndexSegment에 APIs 추가 #15869
  • ISO 8601 날짜 변환 함수와 테스트 추가 #15793
  • CaseSensitiveAnalyzer와 대소문자 구분 텍스트 인덱싱 지원 추가 #15803
  • PR 체크인 중 Dependency Management Guidelines를 자동으로 강제하는 Maven Enforcer Rule 추가 (Part 2) #15795
  • PR 체크인 중 Dependency Management Guidelines를 자동으로 강제하는 Maven Enforcer Rule 추가 #15739
  • TableConfigBuilder에 skipSegmentPreprocess 플래그 추가 #15758
  • 서버 메시지 큐 크기 모니터링 메트릭 추가 #15722
  • Table config decorator 지원 추가 #15714
  • SVForwardIndex와 Dictionary의 세그먼트 종료 기준 확인 추가 #15120
  • Dedup와 Pauseless 통합 테스트 추가 #15398
  • 테이블 리밸런서의 rebalance configs 사전 확인에 updateTargetTier 확인 추가 #15689
  • ResourceUtilizationChecker를 더 쉽게 확장 가능하게 하고 서버 측에 PK count 엔드포인트 추가 #16146
  • README.md 업데이트 - deepwiki 추가, 위키 자동 새로고침 활성화 #16151
  • pinot-s3의 dep에 guava 추가 #16052
  • assertj-core에 test scope 추가 #16019
  • Table Rebalance API에 새 매개변수 추가: Disk Utilization Pre-check Threshold Override #16144
  • 서버 시작 확인 meter 추가 #16128
  • [index] VectorIndexConfig용 json creator initializer 추가 #16191
  • 새 consuming 세그먼트 생성 건너뛰기 로그 추가 #16134
  • broker와 server 수준의 multistage 스레드 제한 구성 추가 #16080
  • Table UI의 세그먼트 상태 필터 추가 #16085
  • UI에 reset segment 연산 추가 #16078
  • partitionId별 badSegments 반환 api 추가 #16067
  • remove ingestion-metrics api 추가 #16045
  • MultiStageOperator의 resource limit 초과 예외 추가 #16077
  • broker 인스턴스에서 처리 전 쿼리 로깅 구성 추가 #16056
  • S3 클라이언트에서 LegacyMd5Plugin 사용 구성 추가 — pre-2.30.0 MD5 체크섬 동작 복원 #16065
  • 인스턴스 할당용 새 ImplicitRealtimeTablePartitionSelector 전략 추가 #15930
  • 데이터 디렉터리 쓰기 권한을 보장하는 무결성 검사 추가 #15876
  • 일부 IndexCreator::add() 함수의 잘못된 데이터 처리 추가 — 레코드 건너뛰기 또는 더미 레코드 추가 #16094
  • IndexCreationContext에 continueOnError 플래그 추가 #16331
  • Get Tenant Table API에 withTableProperties 추가 #16202
  • consumer semaphore 획득 시간 발행 메트릭 추가 #16278
  • broker 응답의 'rlsFiltersApplied' 올바른 직렬화·역직렬화를 위한 JsonProperty 추가 #16250
  • docs: macOS gRPC Java 플러그인 빌드 우회책과 지침 추가 #16329

버그 수정

  • Spool 중간 stage 수정 #15024
  • [Bugfix] Committing 세그먼트를 Completed로 무시하는 확인 추가 #15065
  • MSE 잘못된 통계 시각화 수정 #15188
  • numGroups 메트릭 수정 및 경고 메트릭 추가 #15280
  • rebalance api url 빌더 수정 #15389
  • 사소한 리팩터링 및 수정 #15419
  • ArrowResponseEncoder가 벡터 데이터를 null로 읽을 때 NPE 수정 #15457
  • minAvailableReplicas가 기존 numReplicas의 상한을 갖도록 보장해 StrictReplicaGroup 할당의 rebalance 무한 루프 수정 #15468
  • [bugfix][ui] 테이블 rebalance UI 수정 #15511
  • realtimeBytesConsumed 메트릭과 jmx export 규칙 수정 #16158
  • RefreshSegmentMinionClusterIntegrationTest.checkColumnAddition() 수정 #16125
  • [ui] Fix: Add Schema JSON 필드 검증으로 런타임 오류 방지 #15680
  • Kinesis 파티션 분할 수정 #15563
  • Bug fix: pinot UI의 테이블 이름 정렬 불일치 #15670
  • [bugfix] 테이블 상태 정보에서 삭제 중 세그먼트 제거 #15725
  • 인덱스 크기를 확인하도록 OfflineClusterIntegrationTest 강화 및 기본 컬럼의 인덱스 제거 수정 #15740
  • 빌드 실패를 고치기 위해 japicmp 플러그인의 Baseline jars 업데이트 #15879
  • tier 메타데이터 업데이트의 ZK 접근 감소, 병렬 push 수정 #15933
  • bug fix: consumer close 시 admin client 닫기 #16227
  • flaky 테스트 고치기 위해 대기 조건 변경 #16141
  • 가상 컬럼 지원 기타 수정 #16121
  • 단위 테스트를 단일 스레드로 실행해 CI 오류 해결 시도 #16098
  • multipleselect 컴포넌트 이름 수정 #16009
  • fix: Homebrew 지원으로 protobuf-maven-plugin의 macOS ARM64 프로파일 추가 #16335
  • 쿼리 요청의 log.debug를 log.info로 전환 #15264
  • broker debug api /debug/serverRoutingStats에서 str 대신 JSON 반환 #15018
  • CLP V2 구현의 몇몇 문제 수정 및 통합 테스트 추가 #16298

더 알아보기 (Learn more)