1.3.0
1.3.0
Apache Pinot 1.3.0 릴리스 노트 문서예요. 이 릴리스는 multistage 쿼리 엔진 개선, 효율적인 분석을 위한 실험적 시계열 쿼리 엔진 도입, 데이터베이스 쿼리 할당량, 대용량 결과 집합용 커서 기반 페이지네이션, URL·GeoJson 함수 지원 등 중요한 개선을 제공해요. 보안 취약점과 여러 버그 수정·성능 개선도 처리되어 더 견고하고 다재다능한 플랫폼이 되었어요.
출처: 문서
본문
Multistage 엔진 개선
쿼리 내 공통 표현식 재사용 (spool) #14507, 설계 문서
Apache Pinot의 쿼리 계획 재사용을 하위 트리 대신 stage 간 재사용을 허용하도록 정제해요. stage는 쿼리 계획의 자연스러운 경계로, pull 기반 연산자로 나뉘어요. 쿼리를 실행하기 위해 Pinot은 MailboxSendOperator와 MailboxReceiveOperator로 연결된 stage를 도입해요. 이 제안은 MailboxSendOperator가 여러 stage로 데이터를 보내도록 수정해 stage 연결을 DAG(방향성 비순환 그래프)로 변환해 더 큰 효율성과 유연성을 얻어요.
MultiStage 쿼리의 세그먼트 계획 #13733, #14212
물리 연산자 상세를 포함한 종합 실행 계획 제공에 초점을 둠. 새 explain 모드는 Calcite 용어와 일치하며, broker-서버 통신 흐름을 사용해 쿼리를 실행하지 않고 물리 계획으로 분석·변환해요. 쿼리 실행 계획을 물리적 상세로 강화하는 새 ExplainedPlanNode가 도입되어 사용자에게 더 나은 투명성과 디버깅 능력을 보장해요.
DataBlock Serde 성능 개선 #13303, #13304
이진 형식을 변경하지 않고 메모리 할당과 복사를 줄여 DataBlock 구축, 직렬화, 역직렬화 성능을 개선해요. 벤치마크는 1배에서 3배의 처리량 향상을 보여주며, 메모리 할당이 크게 줄어 프로덕션에서 GC 관련 지연 문제를 최소화해요. 이 개선은 버퍼 변경과 몇몇 스트림 클래스 추가로 달성돼요.
주요 개선 및 버그 수정
- timestamp 타입의 더하기·빼기 허용. #14782
- IN 절에서 DISTINCT가 실수로 제거되지 않도록 PinotAggregateToSemiJoinRule 제거. #14719
- timestamp 인덱스 사용 지원. #14690
- 다형성 스칼라 비교 함수(=, !=, >, >=, <, <=) 지원. #13711
- 표현식 해시 계산을 줄여 MergeEqInFilterOptimizer 최적화. #14732
is_enable_group_trim집계 옵션 지원 추가. #14664is_leaf_return_final_result집계 옵션 지원 추가. #14645- NOW의 반환 타입을 TIMESTAMP로 오버라이드. #14614
- 깨진 BIG_DECIMAL 집계(MIN / MAX / SUM / AVG) 수정. #14689
- 동시에 실행되는 multi-stage 쿼리 수를 제한하는 클러스터 구성 추가. #14574
- lookup JOIN에 필터 허용. #14523
- leaf stage 쿼리 생성 시 쿼리 옵션이 완전히 오버라이드되는 버그 수정. #14603
- multi-stage 쿼리 엔진의 timestamp 리터럴 처리 수정. #14502
- multi-stage 엔진에 사용되는 mailboxes에 TLS 지원 추가. #14476
- broker와 서버 간 TLS 구성 허용. #14387
- multi-stage 쿼리의 BrokerResponse에 tablesQueried 메타데이터 추가. #14384
- 리터럴 전용 필터의 leaf stage pushdown을 방지하기 위해 마지막에 filter reduce 표현식 Calcite 규칙 적용. #14448
- JSON 추출 함수의 문자열 리터럴 반환 타입 추론에서 모든 데이터 타입 지원. #14289
- FIRST_VALUE와 LAST_VALUE window 함수의 IGNORE NULLS 옵션 지원. #14264
- PinotWindowExchangeNodeInsertRule의 window 프레임 상한 offset 추출 수정. #14304
- window 함수용 커스텀 window 프레임 경계 정의 지원. #14273
- 필터 인자와 함께 DISTINCTCOUNTTHETASKETCH 사용 허용 개선. #14285
- multi-stage 쿼리 엔진의 ROUND 스칼라 함수 수정. #14284
- 사용하지 않는 컬럼 교환을 제거하는 LogicalProject pushdown 최적화 활성화 지원. #14198
- 가변 인자 스칼라 함수로 COALESCE 지원. #14195
- lookup join 지원. #13966
- NULLIF 스칼라 함수 추가. #14203
- 필터 집계만 있는
group by쿼리의 모든 그룹 계산. #14211 - 두 쿼리 엔진 모두에서 쿼리를 실행하고 결과를 비교하는 broker API 추가. #13746
- multi-stage 엔진의 데이터베이스 처리 개선. #14040
- 메모리 한계 내에서 큰 조인이 작동하도록 하면서 OOM을 방지하는 CROSS JOIN의 블록별 행 추적 추가. #13981
- Multi-Stage 쿼리의 OOM 보호 지원. #13598, #13955
- multi-stage 엔진용 함수 레지스트리 리팩터링. #13573
- 왼쪽 입력과 조인된 행에 최대 행 수 조인 제한 적용. #13922
- 리터럴 전용 쿼리의 함수 조회에 인자 타입 사용. #13673
- multi-stage 엔진이 비활성화되면 브로커 쿼리가 실패하도록 보장 — 컨트롤러와 동작을 맞춰 사용자 경험 개선. #13732
Pinot의 시계열 엔진 지원 (Timeseries Engine Support in Pinot) 설계 문서
Apache Pinot에 제네릭 시계열 쿼리 엔진을 도입해, 플러그 가능한 프레임워크를 통해 다양한 시계열 쿼리 언어(예: PromQL, M3QL)의 네이티브 지원을 가능하게 해요. 이 개선은 Pinot의 현재 SQL 기반 쿼리 엔진이 시계열 분석에서 가지는 한계를 해결하며, 특히 높은 카디널리티 메트릭이 필요한 관측성 사용 사례에 최적화된 성능과 사용성을 제공해요.
참고: Pinot의 Timeseries Engine 지원은 현재 실험적(Experimental) 상태예요.
주요 기능
플러그 가능한 시계열 쿼리 언어:
- Pinot은 pinot-m3ql 같은 플러그인을 통해 PromQL, Uber의 M3QL 같은 여러 시계열 쿼리 언어를 지원할 예정.
- 예시 쿼리:
- 특정 상점의 시간별 주문 수 플롯.
- 주문 수의 주간 대비(week-over-week) 분석.
- 이러한 플러그인은 커스텀 쿼리 언어의 원활한 통합을 가능하게 하는 새 SPI 모듈을 활용.
플러그 가능한 시계열 연산자:
- 각 쿼리 언어에 특화된 커스텀 연산자(예:
nonNegativeDerivative또는holt_winters)는 Pinot의 핵심 코드를 수정하지 않고 언어별 플러그인 내에서 구현할 수 있음. - 확장 가능한 연산자 추상화는 이해관계자가 고유한 시계열 분석 함수를 정의할 수 있게 함.
새 엔진의 장점:
- 시계열 데이터에 최적화: 행이 아닌 시리즈로 데이터를 처리해 성능을 개선하고 복잡한 분석 함수 추가를 단순화.
- Pinot 코어의 복잡성 감소: 엔진은 Multi-Stage Engine(MSE) 쿼리 스케줄러, 쿼리 디스패처, Mailbox 같은 기존 컴포넌트를 재사용. 동시에 언어 파서와 플래너는 플러그인에서 모듈화 유지.
- 사용성 개선: 사용자가 선호하는 언어로 간결하고 강력한 시계열 쿼리를 실행할 수 있어 SQL의 장황함과 한계를 피하게 함.
관측성 사용 사례에 미치는 영향:
이 새 엔진은 Pinot이 복잡한 시계열 분석을 효율적으로 처리하는 능력을 크게 강화해, 고카디널리티 메트릭과 관측성 워크로드에 이상적인 데이터베이스가 되게 해요.
이 개선은 Pinot을 시계열 분석을 위한 견고하고 다재다능한 플랫폼으로 변모시키는 한 걸음이며, 다양한 쿼리 언어와 커스텀 연산자의 원활한 통합을 가능하게 해요.
이 기능의 일부로 병합된 주요 PR들:
- Pinot 시계열 엔진 SPI. #13885
- 시계열의 combine 및 세그먼트 수준 연산자 추가. #13999
- 시계열 엔진 작동 중인 E2E quickstart. #14048
- sum, min, max 시리즈 빌더의 NULL 케이스 처리. #14084
- 불필요한 시계열 구체화 제거 및 사소한 정리. #14092
- offset 처리와 유효 시간 필터 수정 및 Group-By 표현식 활성화. #14104
- 시계열의 Group-By용 JSON 컬럼 활성화. #14141
- 시계열의 빈 필터 처리 버그 수정. #14192
- 사소한 시계열 엔진 개선. #14227
- 시계열 쿼리 정확성 문제 수정. #14251
- 시계열 ID와 broker 응답 이름 태크 의미 정의. #14286
- 시계열 집계 연산자에서 값 블록의 num docs 사용. #14331
- 시간 버킷을 왼쪽에서 반개방(half open)으로. #14413
- 서버 선택 버그 수정 + 타임아웃 강제. #14426
- 응답 크기 제한, 메트릭, 시리즈 제한. #14501
- Broker 감축 활성화 리팩터링. #14582
- 시계열의 스트리밍 응답 활성화. #14598
- 시계열 교환 연산자, 계획 노드, serde 추가. #14611
- 부분 집계와 복합 중간 타입 지원 추가. #14631
- 다중 서버 쿼리 지원 완료. #14676
데이터베이스 쿼리 할당량 (Database Query Quota) #13544
데이터베이스 내 모든 테이블에 대한 쿼리를 포함해 데이터베이스 수준에서 쿼리 속도 제한을 부과하는 기능을 도입해요. 데이터베이스 수준 rate limiter가 구현되고, 데이터베이스 쿼리 할당량을 확인하는 새 메서드 acquireDatabase(databaseName)가 QueryQuotaManager 인터페이스에 추가돼요.
데이터베이스 쿼리 할당량 구성
- 쿼리 및 스토리지 할당량은 이제 테이블 할당량과 유사하게 프로비저닝되지만 DatabaseConfig znode에서 별도로 관리됨.
- DatabaseConfig znode에 대한 세부 사항:
- 논리적 데이터베이스 엔터티를 나타내지 않음.
- 없어도 데이터베이스 아래 테이블 생성이 방지되지 않음.
- 삭제해도 데이터베이스 내 테이블이 제거되지 않음.
기본 및 오버라이드 할당량
- 기본 쿼리 할당량(databaseMaxQueriesPerSecond: 1000)이 ClusterConfig에 제공됨.
- 특정 데이터베이스의 오버라이드는 znode(예: PROPERTYSTORE/CONFIGS/DATABASE/)를 통해 구성 가능.
구성용 API
| 메서드 | 경로 | 설명 |
|---|---|---|
| POST | /databases/{databaseName}/quotas?maxQueriesPerSecond= | 데이터베이스 쿼리 할당량 설정 |
| GET | /databases/{databaseName}/quotas | 데이터베이스 쿼리 할당량 가져오기 |
동적 할당량 업데이트
- 할당량은 기본 클러스터 수준 할당량과 데이터베이스별 오버라이드의 조합으로 결정됨.
- 브로커별 할당량은 라이브 브로커 수에 따라 동적으로 조정됨.
- 업데이트 처리 방식:
- 데이터베이스 구성 변경 시 브로커에 커스텀 DatabaseConfigRefreshMessage 전송.
- 클러스터 구성의 업데이트를 처리하는 ClusterChangeMediator의 ClusterConfigChangeListener.
- 브로커 리소스 변경 시 브로커별 할당량 조정.
- BrokerResourceOnlineOfflineStateModel의 테이블 OFFLINE -> ONLINE 상태 전환 중 데이터베이스 rate limiter 생성.
이 기능은 쿼리 속도 제한에 대한 세밀한 제어를 제공해, Pinot 내 데이터베이스의 확장성과 효율적인 리소스 관리를 보장해요.
제약 실행용 Binary Workload Scheduler #13847
쿼리를 두 가지 워크로드로 분류해 클러스터 안정성을 보장하고 중요한 연산을 우선시하는 BinaryWorkloadScheduler 도입:
워크로드 범주:
1. 1차 워크로드 (Primary Workload):
- 모든 프로덕션 트래픽의 기본 범주.
- 쿼리는 무제한 FCFS(선입선출) 스케줄러로 실행.
- 일관된 가용성과 성능을 유지하도록 고우선순위·중요 쿼리용으로 설계.
2. 2차 워크로드 (Secondary Workload):
- ad-hoc 쿼리, 디버깅 도구, 대시보드/노트북, 개발 환경, 일회성 테스트용으로 예약.
- 1차 워크로드에 미치는 영향을 최소화하는 몇 가지 제약을 부과:
- 제한된 동시 쿼리: 진행 중 쿼리 수를 상한으로 제한하고, 초과 쿼리는 대기열에 넣음.
- 스레드 제한: 쿼리당 및 2차 워크로드의 모든 쿼리 전반에 worker 스레드 수 제한.
- 대기열 가지치기: 대기열에 너무 오래 있는 쿼리는 시간 또는 대기열 길이를 기준으로 제거.
주요 이점:
- 우선순위: 1차 워크로드가 리소스 집약적이거나 오래 실행되는 2차 쿼리의 영향을 받지 않도록 보장.
- 안정성: 최적화되지 않거나 과도한 ad-hoc 쿼리로 인한 사고를 방지해 클러스터 가용성 보호.
- 확장성: 멀티테넌트 클러스터에서 트래픽을 효율적으로 관리해 워크로드 전반의 서비스 신뢰성 유지.
커서 지원 (Cursors Support) #14110, 설계 문서
커서 지원은 Pinot 클라이언트가 쿼리 결과를 더 작은 청크로 소비할 수 있게 해줘요. 이 기능은 클라이언트가 특히 메모리 같은 더 적은 리소스로 작업할 수 있게 해요. 커서로 애플리케이션 로직이 더 단순해져요. 예를 들어 앱 UI가 테이블이나 그래프의 결과를 페이지네이션하는 경우. 커서 지원은 API를 사용해 구현됐어요.
API
| 메서드 | 경로 | 설명 |
|---|---|---|
| POST | /query/sql | 페이지네이션을 트리거하는 새 broker API 매개변수 추가. |
| GET | /resultStore/{requestId}/results | 위 API로 제출된 쿼리의 결과 집합을 반복하는 데 사용할 수 있는 broker API. |
| GET | /resultStore/{requestId}/ | 쿼리의 BrokerResponse 메타데이터 반환. |
| GET | /resultStore | 응답 저장소에서 사용 가능한 모든 쿼리 결과의 requestId 나열. |
| DELETE | /resultStore/{requestId}/ | 쿼리 결과 삭제. |
SPI
이 기능은 다른 구현을 지원하도록 확장하는 두 개의 SPI를 제공:
- ResponseSerde: 응답 직렬화/역직렬화.
- ResponseStore: 스토리지 시스템에 응답 저장. 두 SPI 모두 Java SPI와 기본 ServiceLoader를 사용해 구현을 찾음. 모든 구현은 구현 발견 파일 생성을 돕도록 AutoService로 애노테이션 해야 함.
URL 함수 지원 #14646
추출, 인코딩/디코딩, 조작 등 URL 처리의 여러 측면을 다루는 다양한 URL 함수를 구현했어요. URL 파싱과 수정을 포함한 작업에 유용해요.
URL 추출 메서드
urlProtocol(String url): URL에서 프로토콜(스킴) 추출.urlDomain(String url): URL에서 도메인 추출.urlDomainWithoutWWW(String url): 앞의 "www."가 있으면 제외하고 도메인 추출.urlTopLevelDomain(String url): URL에서 최상위 도메인(TLD) 추출.urlFirstSignificantSubdomain(String url): URL에서 첫 번째 유효 서브도메인 추출.cutToFirstSignificantSubdomain(String url): URL에서 첫 번째 유효 서브도메인과 최상위 도메인 추출.cutToFirstSignificantSubdomainWithWWW(String url): "www."를 빼지 않고 "첫 번째 유효 서브도메인"까지의 최상위 서브도메인을 포함한 도메인 부분 반환.urlPort(String url): URL에서 포트 추출.urlPath(String url): 쿼리 문자열 없이 URL의 경로 추출.urlPathWithQuery(String url): 쿼리 문자열과 함께 URL의 경로 추출.urlQuery(String url): 앞의 물음표(?)를 제외한 쿼리 문자열을 추출하고 조각(#)과 그 뒤를 제외.urlFragment(String url): URL에서 조각 식별자(해시 기호 없이) 추출.urlQueryStringAndFragment(String url): URL에서 쿼리 문자열과 조각 식별자 추출.extractURLParameter(String url, String name): URL에서 특정 쿼리 매개변수의 값 추출.extractURLParameters(String url): URL에서 모든 쿼리 매개변수를 name=value 쌍 배열로 추출.extractURLParameterNames(String url): URL 쿼리 문자열에서 모든 매개변수 이름 추출.urlHierarchy(String url): 경로와 쿼리 구분자에서 잘린 URL 계층 생성.urlPathHierarchy(String url): 프로토콜과 호스트를 제외한 URL의 경로 요소 계층 생성.
URL 조작 메서드
urlEncode(String url): 문자열을 URL 안전 형식으로 인코딩.urlDecode(String url): URL 인코딩된 문자열 디코딩.urlEncodeFormComponent(String url): RFC-1866 표준에 따라 URL 문자열 인코딩, 공백은 +로 인코딩.urlDecodeFormComponent(String url): RFC-1866 표준에 따라 URL 문자열 디코딩, +는 공백으로 디코딩.urlNetloc(String url): URL에서 네트워크 위치(username:password@host:port) 추출.cutWWW(String url): URL 도메인에서 앞의 "www." 제거.cutQueryString(String url): 물음표를 포함해 쿼리 문자열 제거.cutFragment(String url): 숫자 기호를 포함해 조각 식별자 제거.cutQueryStringAndFragment(String url): 쿼리 문자열과 조각 식별자 모두 제거.cutURLParameter(String url, String name): URL에서 특정 쿼리 매개변수 제거.cutURLParameters(String url, String[] names): URL에서 여러 특정 쿼리 매개변수 제거.
멀티 스트림 수집 지원 (Multi Stream Ingestion Support) #13790, 설계 문서
경고: 이 기능은 Kafka 멀티 스트림 수집에 버그가 있어 1.3.0에서 준비되지 않았어요. #15094 참고.
- 단일 테이블로 여러 소스에서 수집 지원 추가
- 여러 스트림 정의에 기존 인터페이스(TableConfig) 사용
- Stream과 Pinot 세그먼트 간 파티션 id 정의 분리
- 기존 스트림 파티션 자동 확장 로직과 호환. 이 기능은 기존 인터페이스를 변경하지 않음. 사용자는 같은 방식으로 테이블 구성을 정의하고 다른 변환 함수나 인스턴스 할당 전략과 결합할 수 있음.
새 스칼라 함수 지원 #14671
intDiv와intDivOrZero: 정수 나눗셈 수행,intDivOrZero는 0으로 나누거나 최소 음수를 -1로 나눌 때 0을 반환.isFinite,isInfinite,isNaN: double 값이 유한, 무한, NaN인지 각각 확인.ifNotFinite: 주어진 값이 유한하지 않으면 기본값 반환.moduloOrZero와positiveModulo: modulo 연산의 변형,moduloOrZero는 0으로 나누거나 최소 음수를 -1로 나눌 때 0을 반환.negate: double 값의 부정 반환.gcd와lcm: 두 long 값의 최대공약수와 최소공배수 각각 계산.hypot: 다른 두 변의 길이가 주어지면 직각삼각형의 빗변 계산.byteswapInt와byteswapLong: 정수와 long 값의 바이트 스와핑 수행.
GeoJSON 지원 #14405
GeoJSON 스칼라 함수 지원 추가:
ST_GeomFromGeoJson(string) -> binary
ST_GeogFromGeoJson(string) -> binary
ST_AsGeoJson(binary) -> string
지원 데이터 타입:
- Point
- LineString
- Polygon
- MultiPoint
- MultiLineString
- MultiPolygon
- GeometryCollection
- Feature
- FeatureCollection
Distinct 연산자의 개선된 구현 #14701
주요 최적화:
- 데이터 타입별 DistinctTable 추가 및 가능하면 기본 타입 활용
- 단일 컬럼 케이스 특화로 오버헤드 감소
- 사전 기반 연산자로 null 값 처리 허용
- 무제한 LIMIT 케이스 특화
- LIMIT 값을 수집하기 전에 priority queue 생성 안 함
- null 정렬 지원 추가
Upsert 개선
기능과 개선
Upsert 테이블의 새 세그먼트 추적 #13992
- 새로 업로드된 세그먼트가 브로커가 라우팅 테이블에 추가하기 전에 서버에서 처리되어 쿼리가 유효 문서를 놓칠 수 있는 경쟁 조건을 해결하기 위한 개선.
- 서버 측에서 새 세그먼트를 추적하는 구성 가능한
newSegmentTrackingTimeMs(기본 10초)를 도입해, 브로커가 라우팅 테이블을 업데이트할 때까지 접근을 선택적 세그먼트로 허용.
Compaction 플로우 활성화로 Upsert 삭제 일관성 보장 #13347
기본 키에 대한 고유 세그먼트 수를 추적하는 메커니즘을 도입해 upsert-compaction의 불일치를 해결. 삭제된 레코드를 압축하기 전에 레코드가 정확히 한 세그먼트에 존재하도록 보장해, 서버 재시작 중 더 오래된 삭제되지 않은 레코드가 잘못 부활되는 것을 방지하고 일관된 테이블 상태를 보장해요.
일관된 Upsert 뷰를 위한 일관된 세그먼트 추적 #13677
세그먼트 추적과 쿼리 불일치를 해결해 일관된 upsert 뷰 처리를 개선. 주요 변경:
- 완전하고 일관된 세그먼트 추적: 테이블 매니저에 등록하기 전에 세그먼트를 추적하는 새 Set 도입, 동기화된 세그먼트 소속과 validDocIds 접근 보장.
- 세그먼트 교체 개선: 교체 중 mutable·immutable 세그먼트를 모두 등록하는 DuoSegmentDataManager 추가, 수집을 차단하지 않고 쿼리가 완전한 데이터 뷰에 접근 가능.
- 쿼리 처리 강화: 쿼리는 이제 최신 consuming 세그먼트를 획득해 브로커의 라우팅 테이블이 업데이트되지 않아도 새로 수집된 데이터를 놓치지 않도록 함.
- 기타 수정:
_numDocsIndexed를 메타데이터 업데이트 전에 갱신하는 것, null 대신 빈 비트맵 반환, 잠금 로직 밖에서 비트맵 재획득 방지 같은 엣지 케이스 처리. 새 기능 플래그upsertConfig.consistencyMode로 게이트된 이 변경들은 스테이징 환경에서 단위·스트레스 테스트로 검증돼 신뢰성 보장.
기타 주요 개선 및 버그 수정
- UpsertCompactMerge 태스크의 최대 출력 세그먼트 크기 구성. #14772
- upsert-compaction 태스크의 ignoreCrcMismatch 구성 추가. #14668
- minions의 upsert 소형 세그먼트 병합 태스크. #14477
- 세그먼트 스냅샷 전 segmentLock 획득 수정. #14179
- replaceSegment에서 upsert TTL 워터마크 업데이트. #14147
- upsert ttl의 최대 비교 값 확인 수정 및 ttl 밖 세그먼트 추가 허용. #14094
- upsert 삭제 속도를 추적하는 더 많은 관측성과 메트릭. #13838
Lucene과 텍스트 검색 개선
- Lucene 텍스트 인덱스용 인덱스 메타데이터 파일 저장. #13948
- Lucene 분석기와 쿼리 파서의 런타임 구성 가능성 — 동적 텍스트 토큰화와 대소문자 구분/비구분 검색 같은 고급 로그 검색 기능 활성화. #13003
보안 개선 및 취약점 수정
- 예약 스레드로 SSL 인증서 매일 리로드 강제. #14535
- multi-stage 엔진의 broker-서버 간 TLS 구성 허용. #14387
- BasePath 확인에서 Matrix 매개변수 제거. #14383
- get table configs REST API에서 환경 변수·시스템 속성 교체 비활성화. #14002
- 취약점을 위한 의존성 업그레이드. #13892
- QueryServer와 Dispatch 클라이언트의 TLS 구성 지원. #13645
- Multi-State 엔진 쿼리 예외에서 인증 실패 테이블 이름 반환. #13195
- Minion의 TLS 포트 지원. #12943
- 취약점 수정을 위해 hadoop 버전을 3.3.6으로 업그레이드. #12561
- msopenjdk 11 pinot-base-runtime 이미지 취약점 수정. #14030
기타 개선 (Miscellaneous Improvements)
- 클러스터 구성으로 ForwardIndexConfig 기본 설정 허용. #14773
- Datasketches의 Merge Rollup 능력 확장. #14625
- 스키마가 있는 테이블 생성 중 태스크 검증 건너뛰기. #14683
- 서로 다른 rollup 버킷에 sketch 정밀도/정확도 구성 능력 추가. 과거 데이터가 높은 정확도를 필요로 하지 않는 사용 사례에서 공간 절약 도움. #14373
- 애플리케이션 수준 쿼리 할당량 지원 추가. #14226
- 클러스터 구성으로 ForwardIndexConfig 기본 설정 허용 개선. #14773
- mutable Index 클래스를 더 플러그 가능하게 개선. #14609
- IndexedTable의 구성 가능한 초기 용량 허용 개선. #14620
- 특정 세그먼트를 지정된 서버에서 리로드하고 일괄 처리·레플리카 그룹 타겟팅으로 워크로드 관리를 가능하게 하는 유연한 제어용 새 세그먼트 리로드 API 추가. #14544
- 테이블에 대해 새로고침이 필요한 세그먼트를 나열하는 서버 API 추가. #14544
- 병합된 세그먼트의 rollup 전 차원 값 삭제 능력 도입 — 카디널리티를 줄이고 덜 중요한 과거 데이터의 공간 최적화. #14355
- 불변 CLPForwardIndex 생성자와 관련 클래스 지원 추가. #14288
- 자동 세그먼트 새로고침을 지원하는 Minion 태스크 지원 추가. #14300
- S3A 커넥터 지원 추가. #14474
- hex decimal to long 스칼라 함수 지원 추가. #14435
- SchemaConformingTransformer의 데이터 변환 중 null 값 필드 발행 제거. #14351
- CSV record reader가 파싱할 수 없는 줄을 건너뛰도록 개선. #14396
- 세그먼트 리로딩 대상 인스턴스 지정 능력 추가 및 대상 인스턴스에서 세그먼트를 찾지 못할 때 API 응답 메시지 개선. #14393
- JSON Path Exists 함수 지원 추가. #14376
- 빈 테이블 처리 시 MSQ explain과 stageStats 개선. #14374
- 필터 프레디킷에 기반해 GroupByResultHolder의 초기 용량을 동적 조정해 자원 할당을 최적화하고 필터된 group-by 쿼리 성능 개선. #14001
- isEqualSet 함수 지원 추가. #14313
- 테이블 구성과 스키마에서 IndexLoadingConfig와 SegmentGeneratorConfig를 구성해 일관된 인덱스 구성을 보장, 불일치 수정 및
FieldConfig.EncodingType존중. #14258 - 수집 성능과 효율 개선을 위해 기본적으로 CLPMutableForwardIndexV2 사용 추가. #14241
- 애플리케이션 수준 쿼리 할당량 지원 추가. #14226
- MV 컬럼으로 그룹화된 집계의 null 처리 지원 추가. #14071
- 구성으로 zstd·lz4 세그먼트 압축 지정 기능 활성화 지원. #14008
- UI의 map 데이터 타입 지원 추가. #14245
- UI에서 Complex 컬럼 수를 렌더링하도록 SchemaInfo의 ComplexType 지원 추가. #14254
- 암시적 num doc 길이를 포함한 raw fwd index 버전 V5 도입 — 공간 효율성 개선. #14105
- 힌트 없는 동일 위치(colocated) 조인 개선. #13943
- 가변 폭 타입 컬럼을 선택적으로 최적화하는 강화된 optimizeDictionary 사용. #13994
- NumericalFilterOptimizer의 BETWEEN 지원 추가. #14163
- NULLIF 스칼라 함수 지원 추가. #14203
- 세그먼트 컬럼에 null 값이 없을 때 null 처리를 활성화한 상태에서 star-tree 인덱스 사용 허용 개선. #14177
- consuming 세그먼트의 IndexLoadingConfig에서 setter 사용 방지 개선. #14190
- Spark3 세그먼트 생성과 메타데이터 push 작업의 일관된 데이터 push 구현. #14139
- consumer 전반의 동시 세그먼트 커밋을 완화해 파티션이 많은 실시간 테이블의 수집 지연 해결 개선. #14170
- 쿼리 옵션 검증과 오류 처리 개선. #14158
- 스칼라 CASE 함수의 임의 개수 WHEN THEN 절 지원 추가. #14125
- Theta와 Tuple 집계 함수 구성 지원 추가. #14167
- 복합 스키마의 Map 타입 지원 추가. #13906
- 세그먼트 로드 시 오래된 메타데이터가 저장소에 추가되는 것을 방지하기 위한 dedup 기능의 TTL 워터마크 저장/로드 추가. #14137
- BETWEEN의 다형성 스칼라 함수 구현. #14113
- 다형성 이진 산술 스칼라 함수. #14089
- 서버 측 예외를 반환하는 서버를 페널티로 하는 Adaptive Server Selection 개선. #14029
- deep store로의 세그먼트 서버 업로드용 서버 수준 구성 추가. #14093
- METADATA 업로드 타입으로 배치 모드 세그먼트 업로드 지원 추가. #13646
- RealtimeSegmentValidationManager에서 recreateDeletedConsumingSegment 플래그 제거. #14024
- 실시간 수집용 Kafka3 지원. #13891
- SchemaConformingTransformer의 보존 필드에 인덱스 빌드 허용. #13993
- avro 디코더에서 multi-value 컬럼의 null과 emptyLists 구분 지원 추가. #13572
- 기본 쿼리 null 처리 동작을 설정하는 Broker 구성. #13977
- deepstore untarring 실패 시 피어 서버에서 다운로드·untarring을 허용하고 DownloadFromServer를 활성화할 수 있도록 untarring 메서드를 BaseTaskExecutor로 이동. #13964
- Adaptive Server Selection 최적화. #13952
- 커스텀 executor 서비스 지원을 위한 새 SPI — cached와 fixed 스레드 풀의 기본 구현 제공. #13921
- 큰 세그먼트 업데이트 중 경쟁 조건과 타임아웃을 방지하기 위한 PinotLLCRealtimeSegmentManager의 공유 IdealStateUpdaterLock 도입. #13947
- star-tree 인덱스의 집계 함수 매개변수 구성 지원. #13835
- Pinot Spark 커넥터에서 Pinot 세그먼트 생성 쓰기 지원. #13748
- SchemaConformingTransformer의 배열 평탄화 지원. #13890
- 데이터베이스 컨텍스트가 전달될 때 데이터베이스 이름 있음/없음으로 TableConfigs의 테이블 이름 허용. #13934
- nullable 단일 입력 집계 함수의 null 처리 성능 개선. #13791
- 메서드 명명 정제, 문서 추가, 컬럼별 null 전략을 지원하도록 검증·생성자 로직 업데이트로 컬럼 기반 null 처리 개선. #13839
- UI 로드 시간 개선. #13296
- mutable 인덱스 재사용이 활성화될 때 raw 데이터 쓰기를 건너뛰도록 noRawDataForTextIndex 구성 강화 — 전역 비활성화 문제 수정 및 수집 성능 개선. #13776
- 더 나은 이전 버전 호환을 위한 다형성 스칼라 비교 함수 개선. #13870
- 일시 중지 세부 사항을 추적하는 TablePauseStatus 추가. #13803
- 새 레코드/세그먼트 추가 시 오래된 dedup 메타데이터 확인. #13848
- star-tree 인덱스 생성 오류 메시지 개선. #13818
- tar 아카이브의 ZStandard와 LZ4 압축 지원 추가 — 대규모 데이터 작업의 효율 강화와 CPU 병목 감소. #13782
- Net Utils의 IPv6 지원. #13805
- null 비트맵의 카디널리티에 기반해 전체 블록이 null일 때 NullableSingleInputAggregationFunction 최적화. #13758
- 요청 라우팅에서 데이터베이스를 지원하는 요청의 추가 헤더 지원. #13417
- 사용 불가능한 세그먼트의 쿼리 오류 메시지에 라우팅 정책 세부 사항 추가 — 혼란을 줄이고 이슈 트리아주를 빠르게 지원. #13706
- 권한과 접근의 리팩터링 및 정리. #13696, #13633
- /tasks/{taskType}/tasks API의 존재하지 않는 tasktype에서 500 오류 방지. #13537
- STREAM_DATA_LOSS를 데이터 손실 감지를 정확히 반영하고 적절한 정리를 보장하도록 Meter에서 Gauge로 변경. #13712
버그 수정 (Bug Fixes)
- RefreshSegmentTaskExecutor 로거의 오타 수정. #14763
- 변환 중 JSON_ARRAY를 multi-value JSON으로 처리하지 않도록 수정. #14738
- 이동 최소화 파티션 활성 인스턴스 할당 수정. #14726
- limit이 0인
group by없는 집계의 v1 쿼리 엔진 동작 수정. #13564 - Kafka 클라이언트 연결 타임아웃 증가로 메타데이터 가져오기 수정. #14638
- GroupByUtils의 정수 오버플로 수정. #14610
- PropertiesWriter로 index_map 키를 제대로 이스케이프하는 수정. #12018
- group-by 쿼리의 쿼리 옵션 검증 수정. #14618
- RecordExtractor가 빈 array/map과 빈 값의 map 항목을 보존하도록 수정. #14547
- deep store 업로드 재시도 태스크의 CRC 불일치 수정. #14506
- UploadedRealtimeSegmentName 세그먼트의 리로드 허용 수정. #14494
- REGEXP_EXTRACT 변환 함수의 기본값 처리 수정. #14489
- Spark upsert 테이블 백필 지원 수정. #14443
jsonextractscalar의 long 값 파싱 수정. #14337- 무한 보존 테이블의 deep store 업로드 재시도 수정. #14406
- 서버 레플리카와 실행 전반에 걸쳐 결정적 인덱스 처리 순서를 보장해 불일치한 세그먼트 데이터 파일 레이아웃과 불필요한 동기화 방지 수정. #14391
- 스트림 파티션이 더 이상 없을 때 실시간 검증 NPE 수정. #14392
- CLPDecodeTransformFunction에서 만난 NULL 값 처리 수정. #14364
- 내부 복합 쿼리의 TextMatchFilterOptimizer 그룹핑 수정. #14299
- 홈 페이지의 중복 API 호출 제거 수정. #14295
- BaseChunkForwardIndexWriter의 V5 writer 버전 사전 조건 확인 누락 수정. #14265
- 필터 집계만 있는
group by쿼리의 모든 그룹 계산 수정. #14211 - IdealStateGroupCommit의 경쟁 조건 수정. #14237
- forward index 비활성화 시 기본 컬럼 처리 수정. #14215
- null 처리 활성화 시 서버 최종 집계 결과 반환 버그 수정. #14181
- Helm 차트의 Kubernetes 라우팅 문제 수정. #13450
- v4에서 raw 인덱스 변환 수정. #14171
- 서버 시작 시 consuming 세그먼트 정리 수정. #14174
- S3PinotFS listFiles가 비재귀적일 때 디렉터리를 반환하도록 수정. #14073
- low disk 모드의 리밸런서 EV 수렴 확인 수정. #14178
- 형식 변환 중 native text index 복사 수정. #14172
_enableDeletedKeysCompactionConsistency로 removeSegment 플로우 강제 수정. #13914- BrokerQueryEventListener 초기화 수정. #13995
- Schema와 컬럼 메타데이터의 ComplexFieldSpec 지원 수정. #13905
- 공유 리터럴 변환 함수의 경쟁 조건 수정. #13916
- 컬럼 메타데이터의 min/max 값 채우면서 컬럼 최대 길이 속성 존중 수정. #13897
- Azure deep store의 경로 URL 인코딩 건너뛰기 수정. #13850
- Into JDBC 클라이언트의 DUAL SQL 쿼리 처리 수정. #13846
- HTTP 클라이언트의 TLS 구성 수정. #13477
- DynamicBrokerSelection의 버그 수정. #13816
- LiteralValueExtractor의 리터럴 타입 처리 수정. #13715
- 새 파생 컬럼의 세그먼트 리로드 중 NULL 값 적절히 처리 수정. #13212
- ordering이 있는 필터 집계 수정. #13784
- SegmentLineage ZK 레코드에 대한 병렬 업데이트를 방지하는 테이블 수준 잠금 구현하고, 일관성을 위해 실시간 테이블 ideal state 업데이트를 minion 태스크 잠금과 정렬. #13735
- 큰 세그먼트 크기의 FixedByteSVMutableForwardIndex INT 오버플로 문제 수정. #13717
- 프리로드 executor를 고려하도록 프리로드 활성화 확인을 수정하고, 누락된 세그먼트 보고를 방지하기 위해 numMissedSegments 로깅을 정제해 변경되지 않은 세그먼트 제외. #13747
- 서비스 시작 중 리소스 상태 평가 버그 수정 — 서버에 할당된 세그먼트가 없을 때 리소스가 GOOD을 반환하도록 해 소형 테이블과 세그먼트 재분배 문제 해결. #13541
- sampleCompletedSegmentDir과 함께 schemaFile만 사용할 수 있도록 RealtimeProvisioningHelperCommand 수정. #13727