1.1.0
1.1.0
Apache Pinot 1.1.0 릴리스 노트 문서예요. 이 릴리스는 SQL, UI, 성능 개선을 비롯한 여러 기능을 제공하며, V2 multi-stage 쿼리 엔진, 수집, 저장 형식, SQL 지원 등 여러 기능에 걸친 버그 수정도 포함해요.
출처: 문서
본문
요약 (Summary)
이 릴리스는 SQL, UI, 성능 향상 등 여러 기능과 함께, V2 multi-stage 쿼리 엔진, 수집, 저장 형식, SQL 지원 등 다양한 기능에 걸친 버그 수정을 포함해요.
Multi-stage 쿼리 엔진
기능 (Features)
RelDistribution 기반 특성(trait) 계획 지원 (#11976, #12079)
- 더 정확한 leaf-stage 직접 교환/셔플을 위한 RelDistribution 최적화 지원 추가. 또한 파티션 최적화를 leaf stage를 넘어 전체 쿼리 계획으로 확장.
- mailbox/worker 할당 단계에서 분배 특성에 기반한 최적화 적용
- 이전 테이블 파티션 힌트로 결정되던 직접 교환을 수정. 이제 분배 특성으로 직접 교환을 결정: 전파된 특성이 교환 요구 사항과 일치하는 경우에만 적용
- 부작용으로, 동적 브로드캐스트를 보장하고 직접 교환 최적화의 혜택도 받도록
is_colocated_by_join_keys쿼리 옵션이 재도입됨 - 물리 계획 단계에서 사용할 수 있도록 파티션 분배 특성 정보를 트리 전반에 전파 허용 (별도 PR에서 후속)
- 이전 버전 비호환성 참고
- 동일 위치(colocated) 조인을 만들려면 이제
is_colocated_by_join_keys힌트가 필요- 브로드캐스트 교환을 사용하지만 직접 교환으로 끌어올려졌던 semi-join에만 영향을 주어야 함
- inner/left/right/full join은 자동으로 동일 위치를 적용하므로 이전 버전 비호환성의 영향을 받지 않아야 함
- 동일 위치(colocated) 조인을 만들려면 이제
다중 semi-join 지원이 있는 leaf stage 계획 (#11937)
- 제한된 수의 PlanNode를 지원하는 pinotQuery의 한계 해결
- ServerRequest 계획을 2단계로 분할
- 먼저 최대한 많이 PinotQuery로 계획
- PinotQuery로 계획할 수 없는 나머지 노드는 LeafStageTransferrableBlockOperator와 함께 로컬에서 입력으로 실행
ArrayAgg 집계 함수 지원 (#11822)
- 사용법: ArrayAgg(column, 'dataType' [, 'isDistinct'])
- multistage 엔진에서 Float 타입 컬럼은 Double로 취급되므로
FLOAT타입은 지원되지 않음 BOOLEAN,INT,LONG,FLOAT(V1에서만),DOUBLE,STRING,TIMESTAMP데이터 지원. 예:ArrayAgg(intCol, 'INT')는ARRAY<INT>반환
개선 (Enhancements)
SqlKind.OTHERS와SqlKind.OTHER_FUNCTIONS를 정규화하고concat을||연산자로 지원 (#12025)QueryContext의 상수 필터 기능, 서버 처리 지원 (#11956)- 필터 pushdown 테스트 (#11994)
- 쿼리 계획 테스트 개선 (#11966)
- 로직을 명확히 하기 위한 PlanFragmenter 리팩터링 (#11912)
- grpc 요청과 multi-stage leaf stage의 메트릭 발행 관측성 강화 (#11838)
pinot.server.query.log.maxRatePerSecond: 쿼리 로그 최대 속도(QPS, 기본 10K)pinot.server.query.log.droppedReportMaxRatePerSecond: 삭제된 쿼리 로그 보고 최대 속도(QPS, 기본 1)
- multi-stage 쿼리 엔진의 RBAC 인증 확인 보안 강화 (#11830)
- leaf-stage 실행 통계 NPE 처리 강화 (#11805)
- opChains 전반에 메타데이터를 역전파하는 프레임워크 추가 (#11746)
- multi-stage 엔진 바이트 리터럴 처리를 위한 BinaryArray to wire proto 사용 (#11738)
- SEMI join의 동적 브로드캐스트 활성화.
joinOptions(join_strategy = 'hash_table')를 사용한 해시 테이블 조인 활성화 폴백 옵션 추가 (#11696) - dispatch 예외 처리 개선 (#11688)
- 잘못된 dateTime 문자열이 기본값을 반환하도록 함수 시그니처에서 구성 가능하게 허용 (#11258)
fromDateTime(colContainsMalformedStr, '<dateTimeFormat>', '<timezone>', <default_value>)
- multi-stage 집계에서 컬럼 인덱스를 식별자로 직접 저장하도록 개선 (#11617)
- 집계에서 불필요한 행 변환을 피하는 성능 최적화 (#11607)
- 새 세그먼트를 처리하도록
SegmentPartitionMetadataManager강화 (#11585) - 메모리 사용량을 줄이기 위한 쿼리 계획의 mailbox 정보 최적화 (#12382)
- 이 PR은 proto 개체 구조를 변경하므로, 브로커와 서버가 다른 버전일 때 이전 버전 비호환성이 발생함
- 쿼리 계획 직렬화 최적화 (#12370)
- Ser/de stage 계획의 병렬 실행 최적화 (#12363)
- 쿼리 dispatch 최적화 (#12358)
- 단일 키 시나리오의 group-by와 join 성능 최적화 (#11630)
버그 수정, 리팩터링, 정리, 테스트
- 연쇄 리터럴 함수 평가 버그 수정 (#12248)
- sort copy 규칙 수정 (#12251, #12237)
- 리터럴 쿼리의 중복 결과 수정 (#12240)
- 기본 Charset에 UTF-8 인코딩 사용 버그 수정 (#12213)
- 쿼리 라우팅 시 테이블 이름 이스케이프 버그 수정 (#12212)
- 플래너 코드 리팩터링 및 불필요한 규칙 제거 (#12070, #12052)
- relBuilder 중 agg 후 불필요한 project 제거 수정 (#12058)
- multi-semi-join 문제 수정 (#12038)
- leaf limit 리팩터링 문제 수정 (#12001)
- 규칙 후 필터 병합 재추가 (#11989)
- 연산자 EOS pull 수정 (#11970)
- dateTimeConvert 스칼라 함수의 타입 캐스트 문제 수정 (#11839, #11971)
- 각 stage 통계에 명시적 경고 플래그 설정 수정 (#11936)
- mailbox visitor 수신/송신 불일치 수정 (#11908)
- 중첩 semi-join 쿼리의 여러 교환 제거 수정 (#11882)
- 연속 Exchange가 빈 응답을 반환하는 버그 수정 (#11885)
- unit-test-2 빌드 수정 (#11889)
- 실시간 파티션 불일치 메트릭 문제 수정 (#11871)
- 리밸런스 재시도 NPE 수정 (#11883)
- Agg 리터럴 첨부가 BASIC_RULES 이후에 일어나도록 버그 수정 (#11863)
- 실행 통계 map 초기화로 NPE 수정 (#11801)
- 특수 컬럼 이스케이프 테스트 케이스 (#11737)
- multi-stage 엔진 중간 stage의 StPoint 스칼라 함수 사용 수정 (#11731)
- 변환 함수 타입 정리 (#11726)
- 테스트 무시 기능 추가 (#11703)
- 커스텀 속성 명명 수정 (#11675)
- multi-stage 엔진 계획 예외 시 경고 로그 (#11595)
- 메타데이터 오버라이드 사용 수정 (#11587)
- 동일 위치 조인 퀵스타트에서 기본적으로 메타데이터 매니저 활성화 테스트 변경 (#11579)
- IN/NOT-IN 연산 테스트 (#12349)
- stage 계획의 stage id 수정 (#12366)
- case 문 내 IN과 NOT IN 필터 버그 수정 (#12305)
주요 기능 (Notable features)
실시간 소비의 서버 수준 스로틀링 (#12292)
- 이 기능 활성화를 위해 서버 구성
pinot.server.consumption.rate.limit사용 - 서버 rate limiter는 기본적으로 비활성화(기본값 0)
Minion 태스크의 세그먼트 생성 디스크 사용량 감소 (#12220)
MergeRollupTask와RealtimeToOfflineSegmentsTaskminion 태스크에서 지원- 임계값 크기 지정을 위해 taskConfig
segmentMapperFileSizeThresholdInBytes사용
"task": {
"taskTypeConfigsMap": {
"<task_name>": {
"segmentMapperFileSizeThresholdInBytes": "1000000000"
}
}
}
TLS keystore/truststore 교체 지원 (#12277, #12325)
- keystore/truststore를 교체 가능하게 만드는 보안 기능
- 로컬 파일이면 (재시작 없이) keystore/truststore 자동 리로드
고정(sticky) 쿼리 라우팅 (#12276)
-
쿼리/테이블/브로커에 대한 결정적·고정 라우팅 지원 추가. 이 설정으로 주어진 테이블의 모든 쿼리에 대해 같은 서버(또는
MultiStageReplicaGroupSelector의 서버 집합)가 사용됨. -
쿼리 옵션 (테이블/브로커 구성 수준의 고정 라우팅 설정보다 우선)
SET "useFixedReplica"=true; -
테이블 구성 (브로커 구성 수준의 고정 라우팅 설정보다 우선)
"routing": { ... "useFixedReplica": true } -
브로커 conf -
pinot.broker.use.fixed.replica=true
차원 테이블의 중복 기본 키 금지 테이블 구성 (#12290)
- 이 동작 활성화를 위해 tableConfig
dimensionTableConfig.errorOnDuplicatePrimaryKey=true사용 - 기본적으로 비활성화
실시간 테이블의 파티션 수준 ForceCommit (#12088)
- 실시간 테이블의 특정 파티션을 강제 커밋 지원.
- 파티션은
forceCommitAPI에 파티션 이름 또는 consuming 세그먼트 이름의 쉼표 구분 목록으로 지정 가능
구성에서 broker 태그 초기화 지원 (#12175)
- 시작 시 broker 초기 태그 지정 지원.
- broker가 처음 클러스터에 조인할 때 brokerResource 자동 업데이트
- broker 태그는
pinot.broker.instance.tags에 쉼표 구분 값으로 제공
Pulsar용 StreamNative OAuth2 인증 지원 (#12068)
- StreamNative(Pulsar의 클라우드 SaaS 제공)은 OAuth2로 클라이언트를 Pulsar 클러스터에 인증함.
- 자세한 내용은 Pulsar 클라이언트에서 OAuth2 인증 구성 참고
streamConfigs에 다음 속성을 추가해 구성 가능:
"stream.pulsar.issuerUrl": "https://auth.streamnative.cloud"
"stream.pulsar.credsFilePath": "file:///path/to/private_creds_file"
"stream.pulsar.audience": "urn:sn:pulsar:test:test-cluster"
테이블 리밸런스의 low disk 모드 도입 (#12072)
- 새 테이블 리밸런스 부울 구성
lowDiskMode도입. 기본값은 false. - downtime=false인 리밸런스에 적용.
- 활성화하면 세그먼트를 먼저 서버에서 내리고, 오프로드 완료 후 서버에 추가함. 리밸런스 총 시간은 늘어날 수 있지만, 서버 디스크 공간이 부족하고 클러스터를 확장해 더 많은 서버로 테이블을 리밸런스하고 싶을 때 유용.
- #12112가 이 옵션을 토글하는 UI 기능 추가
벡터 인덱스와 HNSW(계층적 내비게이션 가능한 작은 세계) 지원 (#11977)
- float 배열/다중값 컬럼의 Vector Index 지원
- topK 가장 가까운 벡터를 가져오는 프레디킷과 함수 추가. 예시 쿼리
SELECT ProductId, UserId, l2_distance(embedding, ARRAY[-0.0013143676,-0.011042999,...]) AS l2_dist, n_tokens, combined
FROM fineFoodReviews
WHERE VECTOR_SIMILARITY(embedding, ARRAY[-0.0013143676,-0.011042999,...], 5)
ORDER by l2_dist ASC
LIMIT 10
- 함수
l2_distance는 첫 번째 매개변수가 임베딩 컬럼이고 두 번째가 검색어 임베딩 리터럴인 double 값을 반환 VectorSimilarity는 프레디킷이므로topK를 구성하면 이 프레디킷은 세그먼트당topk행을 반환. 이 인덱스를 다른 프레디킷과 함께 사용하면 다른 프레디킷을 일치하는 레코드가topk행에 없을 수 있어 예상한 행 수를 얻지 못할 수 있음
upsert 테이블의 삭제된 키 보존 지원 (#12037)
- upsert 구성
deletedKeysTTL추가 —deletedKeysTTL임계값 기간 후 인메모리 해시맵에서 삭제된 키를 제거하고 validDocID를 유효하지 않게 표시 - 기본적으로 비활성화.
deletedKeysTTL에 유효한 값이 설정된 경우에만 활성화
구성 가능한 Lucene 분석기 (#12027)
- 텍스트 인덱스가 개별 컬럼 단위로 인덱싱·검색에 사용하는 커스텀 Lucene 분석기 지정 기능 도입
- 샘플 사용
fieldConfigList: [
{
"name": "columnName",
"indexType": "TEXT",
"indexTypes": [
"TEXT"
],
"properties": {
"luceneAnalyzerClass": "org.apache.lucene.analysis.core.KeywordAnalyzer"
},
}
]
- 기본 동작은
luceneAnalyzerClass속성이 지정되지 않으면standardAnalyzer사용으로 폴백
파티션 함수로 murmur3 지원 (#12049)
-
columnPartitionMap의functionConfig필드에서 해시용seed와variant선택 필드가 있는 Murmur3 지원.seed기본값은 0. -
Murmur3의 두 변형 지원:x86_32와x64_32—functionConfig의variant필드로 구성. variant를 제공하지 않으면 원래 구현의 일부였던x86_32변형 유지. -
functionConfig예제:"tableIndexConfig": { .. "segmentPartitionConfig": { "columnPartitionMap": { "memberId": { "functionName": "Murmur3", "numPartitions": 3 }, .. } }여기에는 functionConfig가 구성되지 않았으므로
seed값은0, variant는x86_32가 됨."tableIndexConfig": { .. "segmentPartitionConfig": { "columnPartitionMap": { "memberId": { "functionName": "Murmur3", "numPartitions": 3, "functionConfig": { "seed": "9001" }, }, .. } }여기서
seed는9001로 구성되었지만 variant가 제공되지 않았으므로x86_32가 선택됨."tableIndexConfig": { .. "segmentPartitionConfig": { "columnPartitionMap": { "memberId": { "functionName": "Murmur3", "numPartitions": 3, "functionConfig" :{ "seed": "9001" "variant": "x64_32" }, }, .. } }여기서는
variant가 언급되어 Murmur3이9001seed의x64_32변형을 사용함. -
Debezium과Murmur3을 파티셔닝 함수로 사용하는 사용자 참고:- 파티셔닝 키는
byte[],String또는long[]컬럼 중 하나에 설정해야 함 - pinot에서
variant는x64_32,seed는9001로 설정해야 함
- 파티셔닝 키는
고유 MV 값만 저장하는 새 최적화 MV forward index
-
고유 MV 항목만 저장하는 새 MV dictionary 인코딩 forward index 형식 추가
-
이 새 인덱스 형식은 MV 항목이 많이 반복될 때 인덱스 크기를 크게 줄일 수 있음
-
새 인덱스 형식은 인덱스 생성, 파생 컬럼 생성, 세그먼트 리로드 중에 활성화 가능
-
새 인덱스 형식을 활성화하려면
FieldConfig에서 압축 코덱 설정:{ "name": "myCol", "encodingType": "DICTIONARY", "compressionCodec": "MV_ENTRY_DICT" }또는 새 인덱스 JSON 사용:
{ "name": "myCol", "encodingType": "DICTIONARY", "indexes": { "forward": { "dictIdCompressionType": "MV_ENTRY_DICT" } } }
명시적 null 처리 모드 지원 (#11960)
- null을 처리하는 2가지 방법 지원:
- 테이블 모드 — 이미 존재
- 컬럼 모드 — 각 컬럼이 FieldSpec에서 자체 nullability를 지정
- 컬럼 모드는 아래 구성으로 활성화.
enableColumnBasedNullHandling기본값은 false. true로 설정하면 Pinot은TableConfig.IndexingConfig.nullHandlingEnabled를 무시하고, 컬럼은FieldSpec.notNull이 false인 경우에만(기본값이기도 함) nullable이 됨
{
"schemaName": "blablabla",
"dimensionFieldSpecs": [
{
"dataType": "INT",
"name": "nullableField",
"notNull": false
},
{
"dataType": "INT",
"name": "notNullableField",
"notNull": true
},
{
"dataType": "INT",
"name": "defaultNullableField"
},
...
],
"enableColumnBasedNullHandling": true/false
}
Upsert에서 순서 어긋난 이벤트 추적 지원 (#11877)
- 새 upsert 구성
outOfOrderRecordColumn추가 - null이 아닌 값으로 설정하면 이벤트가
OOO인지 확인한 후 해당 컬럼 값을 true/false로 업데이트 skipUpsert사용 시 어떤 이벤트가 순서 어긋났는지 추적하는 데 도움
aggregationConfigs에서 StartreeIndexConfigs로의 압축 구성 지원 (#11744)
- 공간 절약에 사용 가능. 예:
functionColumnPairs가distinctcountrawhll처럼 bytes 출력 타입일 때 - 샘플 구성
"starTreeIndexConfigs": [
{
"dimensionsSplitOrder": [
"a",
"b",
"c"
],
"skipStarNodeCreationForDimensions": [],
"functionColumnPairs": [],
"aggregationConfigs": [
{
"columnName": "column1",
"aggregationFunction": "SUM",
"compressionCodec": "SNAPPY"
},
{
"columnName": "column2",
"aggregationFunction": "distinctcounthll",
"compressionCodec": "LZ4"
}
],
"maxLeafRecords": 10000
}
]
사전 구성 기반 미러 인스턴스 할당 (#11578)
- 사전 구성된 인스턴스 할당 맵에 기반한 인스턴스 할당 지원
- 할당은 항상 사전 구성된 맵의 미러 서버를 존중
- 자세한 내용은 여기
- 샘플 테이블 구성
"instanceAssignmentConfigMap": {
"CONSUMING": {
"partitionSelector": "MIRROR_SERVER_SET_PARTITION_SELECTOR",
"replicaGroupPartitionConfig": { ... },
"tagPoolConfig": {
...
"tag": "mt1_REALTIME"
}
...
}
"COMPLETED": {
"partitionSelector": "MIRROR_SERVER_SET_PARTITION_SELECTOR",
"replicaGroupPartitionConfig": { ... },
"tagPoolConfig": {
...
"tag": "mt1_OFFLINE"
}
...
},
"instancePartitionsMap": {
"CONSUMING": "mt1_CONSUMING"
"COMPLETED": "mt1_OFFLINE"
},
차원 테이블 나열 지원 (#11859)
- /tables controller API의 테이블 "type"에
dimension을 유효한 옵션으로 추가
upsert에서 순서 어긋난 이벤트 버리기 지원 (#11811)
- 이 패치는 upsert의 새 구성
dropOutOfOrderRecord를 추가 - true로 설정하면 pinot은 순서 어긋난 이벤트를 세그먼트에 유지하지 않음
- 이 기능은 다음에 유용:
- 디스크 사용량 절약
- 부분 upsert 테이블에서
skipUpsert사용 시 이전 non-null이 있던 컬럼에 null이 나타나기 시작해 순서 어긋난 이벤트인지 모를 때 생기는 혼란 방지
실패한 테이블 리밸런스 태스크 재시도 지원 (#11740)
RebalanceChecker주기적 태스크의 새 구성:controller.rebalance.checker.frequencyPeriod: 기본 5분; -1은 비활성화controller.rebalanceChecker.initialDelayInSeconds: 기본 2분+
RebalanceConfig에 추가된 새 구성:heartbeatIntervalInMs: 300_000 즉 5분heartbeatTimeoutInMs: 3600_000 즉 1시간maxAttempts: 기본 3, 즉 원래 실행 + 두 번 재시도retryInitialDelayInMs: 300_000 즉 5분, 지터가 있는 지수 백오프용
- 리밸런스와 그 재시도를 모니터링하는 새 메트릭:
- TABLE_REBALANCE_FAILURE("TableRebalanceFailure", false), TableRebalancer.rebalanceTable()에서 발행
- TABLE_REBALANCE_EXECUTION_TIME_MS("tableRebalanceExecutionTimeMs", false), TableRebalancer.rebalanceTable()에서 발행
- TABLE_REBALANCE_FAILURE_DETECTED("TableRebalanceFailureDetected", false), RebalanceChecker에서 발행
- TABLE_REBALANCE_RETRY("TableRebalanceRetry", false), RebalanceChecker에서 발행
- 새 restful API
- 리밸런스를 중지하는
DELETE /tables/{tableName}/rebalanceAPI. 대조적으로, 시작에는POST /tables/{tableName}/rebalance가 사용됨
- 리밸런스를 중지하는
UltraLogLog 지원 (#11835)
- Count Distinct용 UltraLogLog 집계(
distinctCountULL과distinctCountRawULL) - Transform Function을 통한 UltraLogLog 생성
- MergeRollup에서 UltraLogLog 병합
- Star-Tree 인덱스의 UltraLogLog 지원
Apache Datasketches CPC sketch 지원 (#11774)
- 변환 함수를 통한 수집
- 쿼리 집계 함수를 통한 추정치 추출
- 세그먼트 롤업 집계
- StarTree 집계
브로커의 DirectMemory OOM 가능성 감소 지원 (#11710)
-
대체로 이 기능을 활성화하는 두 구성:
- maxServerResponseSizeBytes: 쿼리에 대해 모든 서버에 걸친 최대 직렬화 응답 크기. 이 값은 쿼리를 처리하는 모든 서버에 균등하게 나누어짐
- maxQueryResponseSizeBytes: 쿼리에 대한 서버당 직렬화 응답의 최대 길이
-
구성은 queryOption, tableConfig, Broker 구성으로 사용 가능. 적용 우선순위는 다음과 같음:
우선순위 오버라이드 순서: 1. QueryOption -> maxServerResponseSizeBytes 2. QueryOption -> maxQueryResponseSizeBytes 3. TableConfig -> maxServerResponseSizeBytes 4. TableConfig -> maxQueryResponseSizeBytes 5. BrokerConfig -> pinot.broker.max.server.response.size.bytes 6. BrokerConfig -> pinot.broker.max.query.response.size.bytes
JSON 구성으로 스키마를 만들 수 있게 하는 UI 지원 (#11809)
- 사용자가 전체 JSON을 갖고 있을 때 유용
- UI는 JSON 뷰와 함께 스키마 추가 폼 방식도 유지
지정된 길이보다 긴 값을 무시하는 JSON 인덱스 지원 (#11604)
jsonIndexConfig의 옵션maxValueLength로 값 길이 제한- 0 값(또는 키 생략)은 제한 없음을 의미
MultiValue VarByte V4 인덱스 writer 지원 (#11674)
VarByteChunkForwardIndexWriterV4에서 MV 컬럼 직렬화·쓰기 지원- V4 writer로 인코딩된 SV 가변 길이, MV 고정 길이, MV 가변 길이 버퍼를 읽을 수 있는 V4 reader 지원
다중값(Multivalue) 컬럼의 스칼라 함수 지원 개선 (#11555, #11654)
arrayIndexOfInt(int[] value, int valToFind)
arrayIndexOfLong(int[] value, long valToFind)
arrayIndexOfFloat(int[] value, float valToFind)
arrayIndexOfDouble(int[] value, double valToFind)
arrayIndexOfString(int[] value, String valToFind)
intersectIndices(int[] values1, int[] values2)
FrequentStringsSketch와 FrequentLonsSketch 집계 함수 지원 (#11098)
- 데이터셋의 항목 빈도를 메모리 효율적으로 추정하는 근사 집계 함수. 자세한 내용은 Apache Datasketches 라이브러리 참고
FREQUENTLONGSSKETCH(col, maxMapSize=256) -> Base64 인코딩된 sketch 개체
FREQUENTSTRINGSSKETCH(col, maxMapSize=256) -> Base64 인코딩된 sketch 개체
Controller 테이블 인덱스 API (#11576)
-
테이블의 모든 세그먼트에 대한 집계 인덱스 상세를 가져오는 Table index api.
URL/tables/{tableName}/indexes
-
응답 형식
{ "totalSegments": 31, "columnToIndexesCount": { "col1": { "dictionary": 31, "bloom": 0, "null": 0, "forward": 31, ... "inverted": 0, "some-dynamically-injected-index-type": 31, }, "col2": { ... } ... }
lead controller의 구성 가능한 리밸런스 지연 지원 (#11509)
- lead controller 리밸런스 지연을 이제
controller.resource.rebalance.delay_ms로 구성 가능 - 리밸런스 구성을 변경하면 이제 lead controller 리소스가 업데이트됨
환경 변수를 통한 구성 지원 (#12307)
- Dynamic 매핑으로 ENV 변수를 통한 Pinot 구성 지원 추가
- 자세한 내용은 이슈: #10651
- ENV를 통한 샘플 구성
export PINOT_CONTROLLER_HOST=host
export PINOT_SERVER_PROPERTY_WHATEVER=whatever_property
export ANOTHER_VARIABLE=random
distinct count용 hyperLogLogPlus 집계 함수 추가 (#11346)
- HLL++는 차원의 카디널리티가 10k-100k일 때 HLL보다 정확도가 높음
- 자세한 내용 여기
DISTINCTCOUNTHLLPLUS(some_id, 12)
clpMatch 지원
- "가상" UDF
clpMatch를 CLP 인코딩 필드의 컬럼에 대한 부울 표현식으로 변환하는 쿼리 재작성 로직 추가 - 리라이터를 사용하려면
org.apache.pinot.sql.parsers.rewriter.ClpRewriter를pinot.broker.query.rewriter.class.names에 추가하도록 브로커 구성 수정
DATETIMECONVERTWINDOWHOP 함수 지원 (#11773)
json 값 추출에 json 인덱스를 활용하는 JSON_EXTRACT_INDEX 변환 함수 지원 (#11739)
ArrayAgg 집계 함수 지원 (#11822)
JSON 형식으로 데이터를 생성하는 GenerateData 명령 지원 (#11778)
개선 (Enhancements)
SQL
- ARRAY 함수를 리터럴 평가로 지원 (#12278)
- ARRAY 리터럴 변환 함수 지원 (#12118)
- Theta Sketch 집계 개선 (#12042)
- DistinctCountThetaSketchAggregationFunction의 구성 옵션 추가
- 기존 Theta sketch의 순서를 존중해 union에 "조기 중지" 최적화 사용
- Broker MinGroupTrimSize의 쿼리 옵션 오버라이드 추가 (#11984)
- bytes용 새 스칼라 함수 2개 지원:
toUUIDBytes와fromUUIDBytes(#11988) - Broker에서 groupBy trim 크기를 구성 가능하게 하는 구성 옵션 (#11958)
- distinct count hll++의 사전 집계 지원 (#11747)
- SQL 표준에 맞게 리터럴 타입을 보존하기 위해 literal thrift에 float 타입 추가 (#11697)
- 다중값 컬럼의 집계 함수에 쿼리 함수 오버라이드 추가 (#11307)
- IN 절 평가의 성능 최적화 (#11557)
- text_match 필터를 Lucene으로 최대한 pushdown하는 TextMatchFilterOptimizer 추가 (#12339)
UI
- UI 요소를 비동기로 렌더링해 페이지 로드 속도 향상 (#12210)
- 태스크 상세에서 테이블 이름 링크를 클릭 가능하게 (#12253)
- resumeConsumption API 호출의 Swagger UI 개선 (#12200)
- Query 단축키 수정자로 CTRL 키 지원 추가 (#12087)
- reload에서 부분 인덱스 표시 UI 강화 (#11913)
- Table과 Segment 뷰에 Instance 링크 추가 UI 개선 (#11807)
- reload가 모든 세그먼트 메타데이터를 가져오는 대신 올바른 indexes API를 사용하도록 수정 (#11793)
- 쿼리 예외 표시/숨기기 토글 추가 (#11611)
기타 (Misc)
- on-heap으로 로드되는 String Dictionary의 힙 사용량 감소 개선 (#12223)
- Compaction 태스크에 soft upsert delete 연결 (12330)
- validDocId 메타데이터용 upsert compaction 디버깅 가능성 API (#12275)
- 서버 리소스 클래스를 구성 가능하게 변경 (#12324)
- Startree 인덱스의 공유 집계 — 쿼리에서 사용된 집계를 사전 집계 값 저장에 사용된 집계로 매핑 (#12164)
- stuck kinesis consumer 방지를 위해 Kineses fetch 타임아웃 증가
- 테이블 리밸런스 추적 메트릭 (#12270)
- upsert 메타데이터의 서버 수준 구성 허용 (#11851)
- Kafka 클라이언트 SSL 구성 동적 초기화 지원 (#12249)
- 전체 세그먼트 다운로드 없이 세그먼트 메타데이터 파일 생성 최적화 (#12255)
- deleteRecordColumn 구성에 string/numeric 데이터 타입 허용 (#12222)
- upsert 테이블의 validDocId 원자적·결정적 스냅샷 (#12232, #12246)
- JSON 인덱스 빌드 실패 시 컬럼 이름 추가 관측성 강화 (#12151)
DATE_TIME필드 타입 컬럼용DateTimeGenerator생성 (#12206)- 모든 controller와 minion 메트릭의 singleton 레지스트리 추가 (#12119)
- helm 차트 서버 별도 liveness·readiness probe 엔드포인트 지원 (#11800)
- Table Disabled와 Consumption Paused 메트릭 추가 관측성 강화 (#12000)
SegmentGenerationAndPushTask가 세그먼트를 실시간 테이블에 push 지원 (#12084)- deep store 업로드 재시도를 구성 가능한 병렬성으로 비동기화 (#12017)
- 파티션 그룹 메타데이터를 읽지 않도록 세그먼트 커밋 최적화 (#11943)
- 스레드 수를 줄이기 위해 IngestionDelayTracker의 timer를 scheduled executor service로 대체 (#11849)
- AddTableCommand에서 controller cert 검증을 건너뛰는 옵션
skipControllerCertValidation추가 (#11967) - DataTable 생성 계측 추가 (#11942)
- Bcrypt 비밀번호 캐싱으로 ZkBasicAuthAccessFactory 성능 개선 (#11904)
- 특정 세그먼트 목록의 메타데이터 가져오기 지원 추가 (#11949)
- quickstart의 로컬 tmp 디렉터리 지정 허용 (#11961)
- 단일 서버에 도달하는 쿼리에서 서버가 최종 결과를 직접 반환하는 최적화 (#11938)
- AcquireReleaseColumnsSegmentOperator 조기 해제 explain plan 최적화 (#11945)
- 쿼리 타임아웃 추적 관측성 메트릭 (#11892)
- QueryRunner의 auth 지원 추가 (#11897)
- SegmentProcessorFramework에 커스텀 RecordTransformer 전달 허용 (#11887)
- 브로커 응답에 isPartialResult 플래그 추가 (#11592)
- Google Cloud Storage(GCS) 커넥터에 새 구성 추가:
jsonKey(#11890)jsonKey는 GCP 자격 증명 키를 문자열 형식(일반 문자열 또는 base64 인코딩 문자열)으로 나타냄. 키 다운로드는 서비스 계정 키 만들기 및 관리 참고
- 컬럼 방향으로 세그먼트 빌드 성능 강화 (#11776)
- 기본적으로 비활성화. 테이블 구성
columnMajorSegmentBuilderEnabled설정으로 활성화
- 기본적으로 비활성화. 테이블 구성
- grpc 요청과 multi-stage leaf stage의 메트릭 발행 관측성 강화 (#11838)
pinot.server.query.log.maxRatePerSecond: 쿼리 로그 최대 속도(QPS, 기본 10K)pinot.server.query.log.droppedReportMaxRatePerSecond: 삭제된 쿼리 로그 보고 최대 속도(QPS, 기본 1)
- GRPC 메트릭 노출 관측성 개선 (#11842)
- reload API의 응답 형식을 pretty print로 개선 (#11608)
- Java 21 지원 강화 (#11672)
- RequestContext 클래스에 더 많은 정보 추가 (#11708)
- 주어진 forward index doc id에 대응하는 정확한 버퍼 바이트 범위 읽기 지원 (#11729)
- 표현식 형식 변경을 처리하도록 Broker reducer 강화 (#11762)
- 심층 빌드 인사이트를 활용하기 위해 ge.apache.org에서 빌드 스캔 캡처 (#11767)
- HashMap 초기 용량 업데이트로 여러 곳의 성능 강화 (#11709)
- 세그먼트 파일 생성 후 인덱스 빌드 지원, 완료된 세그먼트에 의존하는 인덱스를 세그먼트 생성 과정의 일부로 빌드 가능 (#11711)
- SimpleSegmentNameGenerator에서 시간 값 제외 지원 (#11650)
- 쿼리 실행 중 예외를 던지는 대신 피해 cpu 사용량 감소 성능 강화 (#11715)
- 향후 ScalarTransformFunctionWrapper에서 null 지원 프레임워크 추가 (#11653)
- netty direct memory 사용량과 최대값을 내보내는 메트릭 관측성 변경 (#11575)
- 테이블의 총 thread cpu 시간을 측정하는 메트릭 추가 관측성 변경 (#11713)
- dropwizard 메트릭에서
SlidingTimeWindowArrayReservoir사용 관측성 변경 (#11695) - upsert 프리로드 사소한 개선 (#11694)
- 추가 Realtime Ingestion 메트릭 노출 관측성 변경 (#11685)
- SegmentCompletionManager의 전역 잠금 제거 성능 강화 (#11679)
- tmp 파일 명명 형식 통일 및 ControllerPeriodicTask 확장으로 tmp 파일 정기 삭제 개선 (#10815)
controller.realtime.segment.tmpFileAsyncDeletionEnabled(기본false)controller.realtime.segment.tmpFileRetentionInSeconds(기본3600)
- csv record reader에서 파싱할 수 없는 레코드 건너뛰기 개선 (#11540, #11594)
- 스키마 추가 시 오버라이드/강제 옵션 허용 (#11572)
- 브로커의 direct memory OOM 처리 강화 (#11496)
- 메타데이터 API가 controller와 서버 API 모두에 upsert 파티션 대 기본 키 수 맵을 반환하도록 강화 (#12334)
- 피어 발견·다운로드 둘 다 재시도하는 피어 서버 세그먼트 다운로드 강화 (#12317)
- StarTreeBuilderUtils와 StarTreeV2BuilderConfig의 헬퍼 함수 (#12361)
- releaseAndRemoveAllSegments 메서드에서 테이블의 모든 세그먼트 해제 성능 최적화 (#12297)
minimizeDataMovement인스턴스 파티션 할당 전략의 풀 선택 유지 강화 (#11953)- ideal state에 대해 세그먼트를 할당하는 upsert 강화 (#11628)
- 추가 Upsert 메트릭을 Prom으로 내보내는 관측성 변경 (#11660)
- minion purge 태스크의 CPU 메트릭 추가 관측성 강화 (#12337)
- broker 이벤트 리스너 requestContext에 HttpHeaders 추가 (#12258)
버그 수정, 리팩터링, 정리, 폐기
- CompactedPinotSegmentRecordReader의 "rewind()" upsert 버그 수정 (#12329)
- Preconditions.checks 실패의 오류 메시지 형식 수정 (#12327)
- Pinot을 multi-release JAR로 배포하는 버그 수정 (#12131, #12300)
- upsert 메타데이터 매니저 수정 (#12319)
- 테이블 타입 접미사가 있는 테이블 쿼리 허용 보안 수정 (#12310)
- upsert 테이블이 tagConfigOverride 구성을 null로 유지하도록 버그 수정 (#12233, #12311)
- stuck kinesis consumer 방지를 위해 Kineses fetch 타임아웃 증가 (#12214)
- JXM → Prom Exporter의 catch-all Regex 수정 (#12073, #12295)
- QuickStart 사용 시 lucene 인덱스 오류 수정 (#12289)
- sketch group-by 쿼리의 null 처리 버그 수정 (#12259)
- Controller SQL 리소스의 null 포인터 예외 수정 (#12211)
- upsert 세그먼트 교체 동기화 수정 (#12105, #12241)
- AWS 세션 토큰이 한 시간 후 만료될 때 S3 연결 풀 오류 버그 수정 (#12221)
- csv 같은 필수 형식에만 headerline을 추가하도록 FileWriter 수정 (#12208)
- pulsar OAuth2 인증의 보안 버그 수정 (#12195)
- 실시간 세그먼트 강제 커밋 시 "segment.flush.threshold.size"를 적절히 계산하는 버그 수정 (#12188)
- 리밸런스 완료 전에 성공을 보고하는 리밸런스 수렴 확인 수정 (#12182)
- 테이블 삭제 시
upsertPrimaryKeysCount메트릭 보고 수정 (#12169) - commons-configuration2 업그레이드를 위한 LICENSE-binary 업데이트 (#12165)
- 서버에 존재하지 않는 세그먼트 프리로드 시 오류 로깅 개선 (#12153)
- 파일 접근 리소스 누출 수정 (#12129)
- CompositeTransformer에서 불필요한 transformer 회피 수집 버그 수정 (#12138)
- 서비스 시작 중 OS 이름을 출력하도록 로깅 개선 (#12135)
- 여러 파일의 로깅 개선 (#12134, #12137, #12127, #12121)
- ExprMinMaxRewriterTest.testQueryRewrite 테스트 수정 (#12047)
- helmchart에서 log4j 기본 경로 수정 (#12069, #12083)
- 커넥터의 기본 brokerUpdateFrequencyInMillis 수정 (#12093)
- README 파일 업데이트 (#12075)
- 세그먼트 프리로드 중 불필요한 잠금 제거 수정 (#12077)
- 강제 커밋 호출 실패를 조용히 무시하는 버그 수정 (#12044)
- 쿼리 실패 없이 서버가 건너뛸 수 있는 선택적 세그먼트 허용 upsert 버그 수정 (#11978)
- consumer 생성 오류의 잘못된 처리 수정 (#12045)
CommonsConfigurationUtils의 메모리 누출 문제 수정 (#12056)- upsert 테이블의 리밸런스 수정 (#12054)
- -0.0과 NaN을 변환하는 새 Transformer 추가 (#12032)
- 사용자 경험 강화를 위한 테이블 구성 inverted index 검증 개선 (#12043)
- HashSet/HashMap을 LinkedHashSet/LinkedHashMap으로 교체해 테스트 flakiness 수정 (#11941)
ServerRoutingStatsManagerTest.testQuerySubmitAndCompletionStatsflaky 테스트 수정 (#12029)- MV 컬럼의 파생 컬럼 수정 (#12028)
- 필터된 집계와 함께 StarTree 인덱스 활용 지원 (#11886)
- 실시간 테이블의 크기 기반 임계값 활성화를 위한 tableConfig 검증 개선 (#12016)
- flaky PinotTenantRestletResourceTest 수정 (#12026)
- flaky PinotTenantRestletResourceTest 수정 (#12019)
- 세그먼트 데이터 매니저 동시 수정 경쟁 조건 수정 (#12004)
- OR 아래 모든 프레디킷이 항상 false일 때 star-tree 남용 수정 (#12003)
- 인스턴스 drop 실패로 인한 테스트 실패 수정 (#12002)
- fromULL 스칼라 함수 수정 (#11995)
- shade 연산 중 module-info.class 제외 수정 (#11975)
- Preconditions의 잘못된 import 수정 (#11979)
- taskName의 불법 문자 '/' 확인 추가 (#11955)
partitionUpsertMetadataManager에 의해 완전히 초기화된 경우에만 새 세그먼트를 등록하도록 버그 수정 (#11964)- 테이블 생성 이벤트 시퀀스 추적 로그 추가 관측성 수정 (#11946)
- minimizeDataMovement 인스턴스 할당 전략의 NPE 수정 (#11952)
- DQL/DML 과정 중 예외의 catch-all 로깅 추가 수정 (#11944)
- upsert 테이블이 upsert 삭제와 upsert ttl 구성 둘 다 가진 경우를 처리하지 않는 버그 수정 (#11791)
- commons-logging 직접 의존성 제거 및 jcl-over-slf4j로 교체 (#11920)
- 상수 STRING 사전의 IN 절 NPE 수정 (#11930)
- 서버 응답 크기 테스트의 flaky OfflineClusterIntegrationTest 수정 (#11926)
- 미러 서버 집합 할당 확인 시 NPE 방지 (#11915)
_segmentAssignmentStrategy를SegmentsValidationAndRetentionConfig로 폐기 #11869- 접근이 거부돼도 auth 단계 타이밍을 캡처하는 버그 수정 (#11884)
- 기본 시간 컬럼이 범위를 벗어나면 행을 유효하지 않게 표시하는 버그 수정 (#11907)
- 포트 이미 바인딩 문제를 피하기 위해 서버 포트 무작위화 수정 (#11861)
- 이전에 인덱싱된 레코드용 LazyRow 추상화 추가 (#11826)
- upsert 테이블이 COMPLETED 세그먼트를 다른 서버에 할당하지 않도록 구성 검증 (#11852)
- pinot-protobuf 모듈의 의존성 충돌 해결 버그 수정 (#11867)
JsonAsyncHttpPinotClientTransportFactory의useMultistageEngine속성 대소문자 수정 (#11820)- pinot-s3 의존성에 woodstox-core 추가 및 스택 트레이스 수정 (#11799)
- pinot-segment-local 테스트를 unit test suite 1에서 2로 이동 수정 (#11865)
- 메타데이터 매니저 초기화 시 upsert 구성 로그 관측성 수정 (#11864)
- consumer 스레드에서 오류 수신 시 테스트 개선 (#11858)
- flaky ArrayAgg 테스트 수정 (#11860)
- TupleSelectionTransformFunctionsTest의 flaky 테스트 수정 (#11848)
- arrayAgg null 지원 수정 (#11853)
- int32/int64에 저장된 decimal 값 읽기 버그 수정 (#11840)
- unit test suite 2에서 중복 pinot-integration-tests 제거 (#11844)
- 쿼리의 null 처리 오류 수정 (#11829)
- 태스크 생성기의 세그먼트 zk 메타데이터 가져오기 방식 수정 (#11832)
- testInvalidateCachedControllerLeader를 getMinInvalidateIntervalMs 기준으로 변경 (#11815)
- 최신 릴리스 반영하도록 doap 업데이트 (#11827)
- 통합 테스트 pom 파일 정리 (#11817)
- 서버 대 세그먼트 맵 읽기 시 OFFLINE 세그먼트 제외 버그 수정 (#11818)
- zstd 압축 parquet 파일 테스트 추가 (#11808)
- reload와 force commit 작업의 작업 제출 시간 수정 (#11803)
- nullable 컬럼을 선택적으로 활성화하는 실제 미지원 구성 제거 (#10653)
- LLCRealtimeClusterIntegrationTest.testReset 수정 (#11806)
- 테이블 구성 읽기 수정 쓰기 변경 api에서 예상 버전 사용 (#11782)
- jobId를 rebalanceConfig 밖으로 이동 (#11790)
- PeerServerSegmentFinder가 HTTPS 포트를 존중하지 않는 문제 수정 (#11752)
- 지리공간 v2 통합 테스트 강화 (#11741)
- upsert 테이블의 리밸런스 통합 테스트 추가 (#11568)
- trivy CI 문제 수정 (#11757)
- RebalanceConfig 클래스 추가로 리밸런스 구성 정리 (#11730)
- protobuf 코멘트를 더 정확하게 수정 (#11735)
- scala 의존성을 root pom으로 이동 (#11671)
- null 값의 ProtoBuf inputformat 플러그인 처리 수정 (#11723)
- tar push로 같은 CRC 새로고침 후 세그먼트 다운로드 URI가 유효하지 않은 버그 수정 (#11720)
- TableCacheTest 수정 (#11717)
- broker jersey bounded thread pool 테스트 추가 (#11705)
- SumAvgGapfillProcessor의 gapfill 버그 수정 (#11714)
- GcsPinotFS가 세분화된 권한으로 동작하도록 버그 수정 (#11655)
- helm 차트의 기본 log4j2 구성 파일 경로 수정 (#11707)
- argmin/max → exprmin/max 코드 및 문서 발생 리팩터링 (#11700)
- 스케줄러 플러그인에서 사용되도록 생성자와 함수를 public으로 변경 (#11699)
- java null 수신 시 json_format이 java null을 반환하도록 버그 수정 (#11673)
- 닫힌 후 upsert 메타데이터 매니저 접근 가능성 수정 (#11692)
- 폐기된
hasOptional키워드 대신isOptional사용 버그 수정 (#11682) - RealtimeTableDataManager의 로깅 문제 수정 (#11693)
- raw forward index의 reader/writer 로직 정리 (#11669)
- Java 21에서 spotless 실행 안 함 (#11670)
- license-maven-plugin 업데이트 (#11665)
- 특수 문자가 있는 로컬 파일 삭제 허용 버그 수정 (#11664)
- CaseTransformFunction::constructStatementListLegacy 정리 (#11339)
- FileChannel이 디스크에 데이터를 커밋하도록 강제 버그 수정 (#11625)
- 메타데이터 없는 옛 폐기된 commit end 제거 (#11662)
- jackson 취약점 수정 (#11619)
- BasicAuthUtils를 pinot-core에서 pinot-common으로 리팩터링 및 pinot-jdbc-client에서 pinot-core 의존성 제거 (#11620)
- 다른 인덱스의 여러 확장 지원 버그 수정 (#11600)
- single-stage 엔진의 alias 처리 수정 (#11610)
- 상수 null 자리 표시자 사용 수정 (#11615)
- 모든 BlockValSet을 같은 패키지로 이동 리팩터링 (#11616)
- pinot-java-client에서 폐기된 Request 클래스 제거 (#11614)
- 옛 thirdeye 파일 제거 리팩터링 (#11609)
- 통합 테스트에서 builder 메서드 사용 테스트 수정 (#11564)
- 깨진 Pinot JDBC 클라이언트 수정 (#11606)
- Forbidden 오류를 Unauthorized로 변경 버그 수정 (#11501)
- 요청 헤더에 잘못된 데이터가 전달되는 스키마 추가 UI 문제 수정 (#11602)
- HLC 처리 코드 제거/폐기 (#11590)
- 새로 생성된 세그먼트 식별에 push time을 사용하는 버그 수정 (#11599)
- line iterator 사용 시 CSVRecordReader 버그 수정 (#11581)
- controller의 실시간 프로토콜에서 split commit과 일부 폐기된 구성 제거 ([#11663])
- 단일 인자 집계 함수 검증 개선 (#11556)
- tabledatamanager 종료 후 lag 발행 안 함 수정 (#11534)
- 파생 컬럼을 만들 수 없으면 reload 실패하도록 버그 수정 (#11559)
- 속성 값 이중 unescape 수정 (#12405)
- 기존 메타데이터에 unescape된 문자가 있을 수 있는 이전 버전 호환 문제 수정 (#12393)
- json 인덱싱 중 오류를 던지기보다 잘못된 json 문자열 건너뛰기 (#12238)
- SSLFactory 재로드 시 여러 파일 동시 쓰기 문제 수정 (#12384)
- thread local 변수를 static으로 만들어 메모리 누출 수정 (#12242)
- Upsert compaction 태스크 생성기 버그 수정 (#12380)
- SSLFactory 갱신 정보 로그 (#12357)
- vector용 array literal 사용 수정 (#12365)
- quickstart 테이블 baseballStats minion 수집 수정 (#12371)
- DistinctCountThetaSketchAggregationFunction의 이전 버전 호환 문제 수정 (#12347)
- 'getValidDocIdMetadata'에서 오류를 던지기보다 건너뛰는 버그 수정 (#12360)
- 연결된 세그먼트가 원격 저장소에서 삭제될 때 세그먼트 메타데이터 정리 수정 (#12350)
- getBigDecimal() scale이 rounding 오류를 던지는 문제 수정 (#12326)
- Helix가 CONSUMING → DROPPED에 대해 2개 전환을 보내는 문제 우회 수정 (#12351)
- nonLeaderForTables를 exhaustive하게 만드는 버그 수정 (#12345)
- mutable lucene 인덱스의 우아한 인터럽트 처리 버그 수정 (#11558, #12274)
- controller의 실시간 프로토콜에서 split commit과 일부 폐기된 구성 제거 (#11663)
- quick start의 테이블 구성 업데이트 (#11652)
- k8s skaffold 스크립트 폐기 및 helm을 프로젝트 루트 디렉터리로 이동 (#11648)
- SingleColumnKeySelector의 NPE 수정 (#11644)
- kafka 빌드 단순화 및 옛 kafka 0.9 파일 제거 (#11638)
- docker 이미지 태그 주석 추가, root 디렉터리에서 helmChart 하이퍼링크 (#11646)
- controller의 오류 응답 개선 (#11624)
- 테이블 구성 get의 인증 단순화 (#11640)
- UpsertCompactionTask에서 빈 download url의 세그먼트 제거 버그 수정 (#12320)
- 파생 클래스가 setUp()에서 오버라이드할 수 있도록 taskManager 리소스를 protected로 만드는 테스트 변경 (#12335)
이전 버전과 호환되지 않는 변경 (Backward incompatible Changes)
-
upsert compaction의 경쟁 조건 수정 (#12346). 아래 이전 버전 비호환성 참고:
- 이 PR은 UpsertCompactionTask에 이전 버전 비호환성을 도입해요. 이전에는 스냅샷 없이 compaction 태스크를 구성할 수 있었어요. 인메모리 기반 validDocIds는 (서버 재시작 및 validDocIds 업데이트 중 validDocIds 비트맵을 가져올 때) 일관성을 주지 못해 다소 위험하다는 것을 발견했어요.
고급 고객이 인메모리 validDocId 비트맵으로 compaction을 실행하려면 이제 UpsertCompactionTask에
enableSnapshot=true를 강제해요.{ "upsertConfig": { "mode": "FULL", "enableSnapshot": true } ... "task": { "taskTypeConfigsMap": { "UpsertCompactionTask": { "schedule": "0 */5 * ? * *", "bufferTimePeriod": "7d", "invalidRecordsThresholdPercent": "30", "invalidRecordsThresholdCount": "100000", "invalidDocIdsType": "SNAPSHOT/IN_MEMORY/IN_MEMORY_WITH_DELETE" } } } }또한 고급 사용자를 위해
invalidDocIdsType을 UpsertCompactionTask에 구성할 수 있게 해요.snapshot: 기본 validDocIds 타입. validDocIds 비트맵이 Pinot 세그먼트의 스냅샷에서 로드됨을 나타냄. 이 타입에는 UpsertConfig의enableSnapshot이 활성화되어야 함.onHeap: validDocIds 비트맵을 서버에서 가져옴.onHeapWithDelete: validDocIds 비트맵을 서버에서 가져옴. 삭제된 문서도 고려함. 이 타입에는 UpsertConfig의deleteRecordColumn이 제공되어야 함.
-
기능 플래그
allow.table.name.with.database제거 (#12402) -
테이블 생성 시 스키마 이름이 테이블 이름과 일치하지 않으면 예외를 던지는 오류 처리 (#11591)
-
GET 호출에서 테이블 상태 업데이트 연산을 제거하는 비호환 API 수정 (#11621)
-
JSON 응답에서 BigDecimal 데이터 타입을 문자열로 표현 (#11716)
-
SQL 호환성 유지를 위해 단일 인용부호 리터럴 타입 자동 파생 안 함 (#11763)
-
항상 서버에서 split commit을 사용하고 비활성화 옵션을 금지하는 변경 (#11680, #11687)
-
스키마의 Float와 Double 기본값에 NaN 허용하지 않도록 변경 (#11661)
-
TableDataManagerConfig제거 코드 정리 및 리팩터링 (#12189) -
쿼리와 세그먼트 값의 일관성을 위한 파티션 처리 수정 (#12115)
-
commons-configuration2 마이그레이션 변경 (#11985)
-
upsert 메타데이터 매니저 생성자 단순화 정리 (#12120)
-
pom.xml 오타 수정 (#11997)
-
Jetbrains Intellij/Datagrip 데이터베이스 도구 지원 JDBC 드라이버 수정 (#11814)
-
noDictionaryConfig와 noDictionaryColumns의 ForwardIndexType 회귀 수정 (#11784)
-
pr 테스트 스크립트와 codecov 분리 (#11804)
-
reload 상태가 online/consuming 세그먼트만 계산하도록 버그 수정 (#11787)
-
flaky TableViewsTest 수정 (#11770)
-
flaky 테스트 수정 (#11771)
-
trivy 작업을 위해 더 많은 디스크 확보 정리 (#11780)
-
controller 시작 중 테이블 구성의 스키마 이름 수정 (#11574)
-
파티션 정보 가져오기 실패 시 NPE 방지 (#11769)
-
CaseTransform함수의 null 처리를 위한 UT 추가 (#11721) -
복제 수가 < 2일 때 피어 다운로드 금지 버그 수정 (#11469)
-
Docker 이미지와 GitHub action 스크립트 업데이트 (#12378)
-
쿼리 테스트 프레임워크 강화 (#12215)
라이브러리 업그레이드 및 의존성
- maven-jar-plugin과 maven-enforcer-plugin 버전 업데이트 (#11637)
- classpath에 의존하는 대신 테스트 제공자로 testng 명시 업데이트 (#11612)
- compatibility verifier 버전 업데이트 (#11684)
- Avro 의존성을 1.10.2로 업그레이드 (#11698)
- testng 버전 7.8.0으로 업그레이드 (#11462)
- lombok 버전 및 구성 업데이트 (#11742)
- Apache Helix를 1.3.1 버전으로 업그레이드 (#11754)
- spark를 3.2에서 3.5로 업그레이드 (#11702)
- commons-configuration2 의존성 추가 (#11792)
- 선택적 proto 필드 관련 오류 수정을 위해 confluent 라이브러리를 7.2.6으로 업그레이드 (#11753)
- lucene을 9.8.0으로 업그레이드하고 텍스트 인덱스 버전 업그레이드 (#11857)
PinotConfiguartion을commons-configuartion2로 업그레이드 (#11916)- PinotConfig commons-configuartions2 업그레이드 전 (#11868)
- commons-codec:commons-codec를 1.15에서 1.16.0으로 상향 (#12204)
- flink.version을 1.12.0에서 1.14.6으로 상향 (#12202)
- com.yscope.clp:clp-ffi를 0.4.3에서 0.4.4로 상향 (#12203)
- org.apache.spark:spark-launcher_2.12를 3.2.1에서 3.5.0으로 상향 (#12199)
- io.grpc:grpc-context를 1.59.0에서 1.60.1로 상향 (#12198)
- com.azure:azure-core를 1.37.0에서 1.45.1로 상향 (#12193)
- org.freemarker:freemarker를 2.3.30에서 2.3.32로 상향 (#12192)
- com.google.auto.service:auto-service를 1.0.1에서 1.1.1로 상향 (#12183)
- dropwizard-metrics.version을 4.2.22에서 4.2.23으로 상향 (#12178)
- org.apache.yetus:audience-annotations를 0.13.0에서 0.15.0으로 상향 (#12170)
- com.gradle:common-custom-user-data-maven-extension 상향 (#12171)
- org.apache.httpcomponents:httpclient를 4.5.13에서 4.5.14로 상향 (#12172)
- org.glassfish.tyrus.bundles:tyrus-standalone-client 상향 (#12162)
- com.google.api.grpc:proto-google-common-protos 상향 (#12159)
- org.apache.datasketches:datasketches-java를 4.1.0에서 5.0.0으로 상향 (#12161)
- org.apache.zookeeper:zookeeper를 3.6.3에서 3.7.2로 상향 (#12152)
- org.apache.commons:commons-collections4를 4.1에서 4.4로 상향 (#12149)
- log4j.version을 2.20.0에서 2.22.0으로 상향 (#12143)
- com.github.luben:zstd-jni를 1.5.5-6에서 1.5.5-11로 상향 (#12125)
- com.google.guava:guava를 32.0.1-jre에서 32.1.3-jre로 상향 (#12124)
- org.apache.avro:avro를 1.10.2에서 1.11.3으로 상향 (#12116)
- org.apache.maven.plugins:maven-assembly-plugin을 3.1.1에서 3.6.0으로 상향 (#12109)
- net.java.dev.javacc:javacc를 7.0.10에서 7.0.13으로 상향 (#12103)
- com.azure:azure-identity를 1.8.1에서 1.11.1로 상향 (#12095)
- xml-apis:xml-apis를 1.4.01에서 2.0.2로 상향 (#12082)
- parquet 버전을 1.13.1로 상향 (#12076)
- io.grpc:grpc-context를 1.14.0에서 1.59.0으로 상향 (#12034)
- org.reactivestreams:reactive-streams를 1.0.3에서 1.0.4로 상향 (#12033)
- org.codehaus.mojo:appassembler-maven-plugin을 1.10에서 2.1.0으로 상향 (#12030)
- com.google.code.findbugs:jsr305를 3.0.0에서 3.0.2로 상향 (#12031)
- org.jacoco:jacoco-maven-plugin을 0.8.9에서 0.8.11로 상향 (#12024)
- dropwizard-metrics.version을 4.2.2에서 4.2.22로 상향 (#12022)
- grpc.version을 1.53.0에서 1.59.0으로 상향 (#12023)
- com.google.code.gson:gson을 2.2.4에서 2.10.1로 상향 (#12009)
- net.nicoulaj.maven.plugins:checksum-maven-plugin을 1.8에서 1.11로 상향 (#12008)
- circe.version을 0.14.2에서 0.14.6으로 상향 (#12006)
- com.mercateo:test-clock을 1.0.2에서 1.0.4로 상향 (#12005)
- simpleclient_common.version을 0.8.1에서 0.16.0으로 상향 (#11986)
- com.jayway.jsonpath:json-path를 2.7.0에서 2.8.0으로 상향 (#11987)
- commons-net:commons-net을 3.1에서 3.10.0으로 상향 (#11982)
- org.scalatest:scalatest-maven-plugin을 1.0에서 2.2.0으로 상향 (#11973)
- io.netty:netty-bom을 4.1.94.Final에서 4.1.100.Final로 상향 (#11972)
- com.google.errorprone:error_prone_annotations를 2.3.4에서 2.23.0으로 상향 (#11905)
- net.minidev:json-smart를 2.4.10에서 2.5.0으로 상향 (#11875)
- org.yaml:snakeyaml을 2.0에서 2.2로 상향 (#11876)
- /pinot-controller/src/main/resources의 browserify-sign 상향 (#11896)
- org.easymock:easymock을 4.2에서 5.2.0으로 상향 (#11854)
- org.codehaus.mojo:exec-maven-plugin을 1.5.0에서 3.1.0으로 상향 (#11856)
- com.github.luben:zstd-jni를 1.5.2-3에서 1.5.5-6으로 상향 (#11855)
- aws.sdk.version을 2.20.94에서 2.20.137로 상향 (#11463)
- org.xerial.snappy:snappy-java를 1.1.10.1에서 1.1.10.4로 상향 (#11678)