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은 자동으로 동일 위치를 적용하므로 이전 버전 비호환성의 영향을 받지 않아야 함

다중 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와 RealtimeToOfflineSegmentsTask minion 태스크에서 지원
  • 임계값 크기 지정을 위해 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)

  • 실시간 테이블의 특정 파티션을 강제 커밋 지원.
  • 파티션은 forceCommit API에 파티션 이름 또는 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이 9001 seed의 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}/rebalance API. 대조적으로, 시작에는 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)
  • 컬럼 방향으로 세그먼트 빌드 성능 강화 (#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.testQuerySubmitAndCompletionStats flaky 테스트 수정 (#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에 구성할 수 있게 해요.

    1. snapshot: 기본 validDocIds 타입. validDocIds 비트맵이 Pinot 세그먼트의 스냅샷에서 로드됨을 나타냄. 이 타입에는 UpsertConfig의 enableSnapshot이 활성화되어야 함.
      1. onHeap: validDocIds 비트맵을 서버에서 가져옴.
      2. onHeapWithDelete: validDocIds 비트맵을 서버에서 가져옴. 삭제된 문서도 고려함. 이 타입에는 UpsertConfig의 deleteRecordColumn이 제공되어야 함.
  • 기능 플래그 allow.table.name.with.database 제거 (#12402)

  • 테이블 생성 시 스키마 이름이 테이블 이름과 일치하지 않으면 예외를 던지는 오류 처리 (#11591)

  • dateTimeConvert 스칼라 함수의 타입 캐스트 문제 수정 (#11839, #11971)

  • 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)

더 알아보기 (Learn more)