0.9.0
0.9.0
Apache Pinot 0.9.0 릴리스 노트 문서예요. 이 릴리스는 사용자의 일상 운영 작업을 단순화하기 위한 세그먼트 병합과 롤업(Merge and Rollup)이라는 새 기능을 도입했어요. dropwizard를 지원하는 새 메트릭스 플러그인도 추가되었고, 평소처럼 많은 UI/성능 개선도 포함되어 있어요.
출처: 문서
본문
요약 (Summary)
이 릴리스는 사용자의 일상 운영 작업을 단순화하기 위한 세그먼트 병합과 롤업(Segment Merge and Rollup)이라는 새 기능을 도입해요. dropwizard를 지원하는 새 메트릭스 플러그인도 추가되었고, 평소처럼 새 기능과 많은 UI/성능 개선이 포함되어 있어요.
릴리스는 다음 커밋에서 생성되었어요: 13c9ee9 그리고 다음 cherry-pick들: 668b5e0, ee887b9
세그먼트 병합과 롤업 지원 (Support Segment Merge and Roll-up)
LinkedIn은 비즈니스 메트릭스 대시보드를 제공하는 대규모 멀티테넌트 클러스터를 운영하면서, 테이블이 수백만 개의 작은 세그먼트로 구성되어 있다는 것을 발견했어요. 이로 인해 Helix/Zookeeper의 느린 작업, 처리할 태스크가 너무 많아 오래 걸리는 쿼리, 그리고 압축 부족으로 인한 공간 낭비가 발생하고 있었어요.
이 문제를 해결하기 위해 세그먼트 병합 태스크를 추가했는데, 이 태스크는 타임스탬프를 기준으로 세그먼트를 압축하고 오래된 데이터를 롤업/집계해요. 태스크는 스케줄로 실행하거나 Pinot REST API로 수동으로 트리거할 수 있어요.
현재 이 기능은 오프라인 테이블에서만 사용할 수 있으며, 실시간 테이블은 향후 릴리스에서 추가될 예정이에요.
주요 변경:
- 강화된 SegmentProcessorFramework를 MergeRollupTaskExecutor에 통합 (#7180)
- 오프라인 테이블용 Merge/Rollup 태스크 스케줄러 (#7178)
- 세그먼트를 업로드할 때 메타데이터를 업데이트하지 않는 MergeRollupTask 수정 (#7289)
- MergeRollupTask 통합 테스트 (#7283)
- mergeRollupTask 지연 메트릭 추가 (#7368)
- MergeRollupTaskGenerator 강화: 병렬 버킷 스케줄링 활성화 (#7481)
- 병합/롤업 지연 메트릭에 maxEndTimeMs 사용 (#7617)
UI 개선 (UI Improvement)
이 릴리스는 Pinot 쿼리 콘솔 UI의 개선도 포함해요.
- 쿼리 콘솔에서 Cmd+Enter 단축키로 쿼리 실행 (#7359)
- SQL 에디터에서 tooltip 표시 (#7387)
- SQL 에디터 박스를 확장 가능하게 변경 (#7381)
- 세그먼트 수로 테이블 정렬 수정 (#7564)
SQL 개선 (SQL Improvements)
Pinot의 SQL 구현에도 개선과 추가가 있었어요.
새 함수 (New functions):
- IN (#7542)
- LASTWITHTIME (#7584)
- MV 컬럼의 ID_SET (#7355)
- Percentile TDigest와 Est의 raw 결과 (#7226)
- toDateTime 함수에 timezone 인자 추가 (#7552)
새 프레디킷 지원 (New predicates are supported):
쿼리 호환성 개선 (Query compatibility improvements):
- 리터럴의 데이터 타입 추론 (#7332)
- 프레디킷의 논리 식별자(logical identifier) 지원 (#7347)
- 최상위 배열 path 표현식을 가진 JSON 쿼리 지원 (#7511)
- 결과 정확도를 높이기 위한 구성 가능한 group by trim 크기 지원 (#7241)
성능 개선 (Performance Improvements)
이 릴리스는 많은 성능 개선을 포함하며, 일상 쿼리에서 체감할 수 있어요. 아래 나열된 모든 훌륭한 기여에 감사드립니다:
- 세그먼트 변환 태스크의 디스크 사용량 감소 (#7193)
- 더 빠른 매핑을 위해 Java Class와 PinotDataType의 연관 단순화 (#7402)
- jsonpath 평가마다 상태 없는 ParseContextImpl 생성을 피하고 varargs 할당 회피 (#7412)
- MINUS를 STRCMP로 대체 (#7394)
- int, long, float, double, dictionary화된 SV 컬럼용 bit-sliced range index (#7454)
- JDK9+에서 벡터화된 부호 없는 비교 접근에 MethodHandle 사용 (#7487)
- 쿼리당 스레드 사용을 제한하는 옵션 추가 (#7492)
- 범위 쿼리 개선 (#7513)
- 더 빠른 비트맵 스캔 (#7530)
- 빈 세그먼트가 없을 때 가지치기를 건너뛰도록 EmptySegmentPruner 최적화 (#7531)
- 과도한 디스크 압박을 피하기 위해 제한된 윈도우로 비트맵 매핑 (#7535)
- 더 작은 파일 크기를 위한 비트맵의 RLE 압축 허용 (#7582)
- JSON과 RANGE 인덱스가 있는 컬럼의 raw 인덱스 속성 지원 (#7615)
- IN 프레디킷을 포함하도록 BloomFilter 규칙 강화 (#7444) (#7624)
LZ4_WITH_LENGTHchunk 압축 타입 도입 (#7655)- ColumnValueSegmentPruner 강화 및 bloom filter 프리페치 지원 (#7654)
- DistinctCountHLL 집계 함수에 세그먼트 내 dictIds 최적화 적용 (#7630)
- 세그먼트 가지치기 중 각 세그먼트 처리 후 bloom filter 해제 (#7668)
- JSONPath 캐시 비효율 문제 수정 (#7409)
- SWAR 패딩 검색으로 getUnpaddedString 최적화 (#7708)
- 더 가벼운 LiteralTransformFunction, 과도한 배열 채우기 회피 (#7707)
- 함수 호출 오버헤드를 막기 위한 인라인 이진 비교 연산 (#7709)
- 쿼리 컨텍스트에서 리터럴을 메모이즈해 중복 제거 (#7720)
기타 주요 새 기능과 변경 (Other Notable New Features and Changes)
- 사람이 읽기 쉬운 Controller 구성 (#7173)
- geoToH3 함수 지원 추가 (#7182)
- Pinot 플러그인으로 Apache Pulsar 추가 (#7223) (#7247)
- dropwizard 메트릭스 플러그인 추가 (#7263)
- Star Tree 인덱스에서 OR 프레디킷 실행 도입 (#7184)
- jsonPathArray로 개체 배열에서 값 추출 허용 (#7208)
- 실시간 테이블 메타데이터와 인덱스 API 추가 (#7169)
- 혼합 데이터 타입 배열 지원 (#7234)
- reload API에서 강제 세그먼트 다운로드 지원 (#7249)
- zk api에서 압축 해제된 znRecord 표시 (#7304)
- minion 태스크 상태를 가져오는 디버그 엔드포인트 추가 (#7300)
- 구성된 구분자에 대한 CSV 헤더 검증 (#7237)
- 수집 작업 명령에 auth 토큰과 user/password 지원 추가 (#7233)
- upsert 기본 키의 해시 저장 옵션 추가 (#7246)
- 시간 컬럼의 null 지원 추가 (#7269)
- mode 집계 함수 추가 (#7318)
- Pinot 서버에서 swagger 비활성화 지원 (#7341)
- 테이블 삭제 시 메타데이터를 제대로 삭제 (#7329)
- 기본 Obfuscator 지원 추가 (#7407)
- web identity token으로 인증을 가능하게 하는 AWS sts 의존성 추가 (#7017) (#7445)
- 디버그 엔드포인트 /appconfigs에서 자격 증명 마스킹 (#7452)
- /sql 쿼리 엔드포인트를 auth와 호환되도록 수정 (#7230)
- BasicAuthPrincipal 권한 검사의 대소문자 구분 문제 수정 (#7354)
- SegmentGenerationAndPushTaskExecutor의 auth 토큰 주입 수정 (#7464)
- IndexingConfig에 segmentNameGeneratorType 구성 추가 (#7346)
- PeriodicTask 수동 트리거 지원 (#7174)
- 단일 태스크의 minion 태스크 상태를 확인하는 엔드포인트 추가 (#7353)
- 세그먼트의 부분 상태 표시 및 CONSUMING 상태를 좋은 세그먼트 상태로 계산 (#7327)
- Realtime Provisioning Rule 출력에 "num rows in segments"와 "num segments queried per host" 추가 (#7282)
- override가 있는 addSchema로 스키마 업데이트 시 스키마 이전 호환성 확인 (#7374)
- IndexedTable 최적화 (#7373)
- V3 세그먼트 형식에서 인덱스 제거 지원 (#7301)
- TableResizer 최적화 (#7392)
- IndexedTable에 resultSize 도입 (#7420)
- offset 기반 실시간 consumption 상태 확인 (#7267)
- 스택 트레이스 반환에 causes 추가 (#7460)
- controller 리소스 패키지 구성 키 생성 (#7488)
- 테이블 이름과 다른 스키마 이름을 지원하도록 TableCache 강화 (#7525)
- realtimeToOffline 태스크 검증 추가 (#7523)
- CombineOperator 멀티스레딩 로직 통일 (#7450)
- TableRebalancer에서 레플리카 1개 테이블의 무중단 리밸런스 지원 (#7532)
- MinionConf 도입, END_REPLACE_SEGMENTS_TIMEOUT_MS를 태스크 구성 대신 minion 구성으로 이동 (#7516)
- tuner api 조정 (#7553)
- 메트릭스 라이브러리 구성 추가 (#7551)
- geo 타입 변환 스칼라 함수 추가 (#7573)
- BOOLEAN_ARRAY와 TIMESTAMP_ARRAY 타입 추가 (#7581)
- MV raw forward index와 MV
BYTES데이터 타입 추가 (#7595) - 가장 많이 로드된 인스턴스부터 세그먼트를 오프로드하도록 TableRebalancer 강화 (#7574)
- 오프라인과 실시간 테넌트를 구분하도록 get tenant API 개선 (#7548)
- 커스터마이징을 허용하도록 쿼리 rewriter를 인터페이스와 구현으로 리팩터링 (#7576)
- ServiceStartable에서 ZK의 전역 클러스터 구성으로 instance 구성에 적용 (#7593)
- 차원 테이블 생성이 테넌트 검증을 우회하도록 변경 (#7559)
- No Op 필터에 Metadata와 Dictionary 기반 계획 허용 (#7563)
- 스키마에 없는 식별자를 가진 쿼리 거부 (#7590)
- 세그먼트 업로드/다운로드 재시도 시 라운드 로빈 IP 주소 (#7585)
- 오프라인 테이블 리로드에서 다중값 파생 컬럼 지원 (#7632)
- 세그먼트 이름에서 segmentNamePostfix 지원 (#7646)
- select segments API 추가 (#7651)
- Controller getTableInstance() 호출이 이제 테이블의 라이브 브로커 목록을 반환 (#7556)
- Text 인덱스의 Raw 컬럼에 대한 MV 필드 지원 허용 (#7638)
- distinctCount를 segmentPartitionedDistinctCount로 오버라이드 허용 (#7664)
- UPSERT와 JSON 인덱스를 모두 가진 퀵스타트 추가 (#7669)
- revertSegmentReplacement API 추가 (#7662)
- 비차단 의미론으로 부드러운 세그먼트 리로딩 (#7675)
- PartitionUpsertMetadataManager에서 재사용된 레코드 정리 (#7676)
- args4j를 picocli로 대체 (#7665)
- datetime 컬럼 일관성 있게 처리 (#7645) (#7705)
- 쿼리 요청에 헤더 전달 허용 (#7696) (#7712)
- 차원 컬럼 타입에 JSON 데이터 타입 추가 허용 (#7718)
- SegmentDirectoryLoader와 tierBackend 개념 분리 (#7737)
- 크기 균형 V4 raw chunk 포맷 구현 (#7661)
- presto-pinot-driver lib 추가 (#7384)
주요 버그 수정 (Major Bug fixes)
- JDBC 드라이버의 스키마에 존재하지 않는 메트릭 컬럼에 대한 null 포인터 예외 수정 (#7175)
- TASK_MANAGER_FREQUENCY_PERIOD의 구성 키 수정 (#7198)
- pinot java 클라이언트에 zkClient close 추가 수정 (#7196)
- 쿼리 json 파싱 오류 무시 (#7165)
- PinotServiceManager의 shutdown hook 수정 (#7251) (#7253)
- STRING에서 BOOLEAN으로의 데이터 타입 변경을 이전 버전 호환 스키마 변경으로 처리 (#7259)
- gcp 하드코딩 값을 제네릭 애노테이션으로 대체 (#6985)
- 인플레이스 변환을 위한 세그먼트 변환 executor 수정 (#7265)
- Kafka 파티션 수준 consumer가 중지되지 않았을 때 consuming rate 보고 수정 (#7322)
- 세그먼트 lineage의 동시 수정 문제 수정 (#7343)
- PinotHelixResourceManager의 TableNotFound 오류 메시지 수정 (#7340)
- upload LLC segment 엔드포인트의 잘린 다운로드 URL 수정 (#7361)
- 테이블 업데이트 시 태스크 스케줄링 수정 (#7362)
- ONLINE_MINION_INSTANCES 메트릭의 메트릭 메서드 수정 (#7363)
- JsonToPinotSchema 동작을 AvroSchemaToPinotSchema와 일관되게 수정 (#7366)
- consuming 세그먼트의 currentOffset 변동성 수정 (#7365)
- 누락된 URI의 오해 소지 있는 오류 메시지 수정 (#7367)
- getColumnIndices 메서드의 정확성 수정 (#7370)
- SegmentZKMetadata 시간 처리 수정 (#7375)
- 세그먼트 lineage 정리의 보존 수정 (#7424)
- 불법 파일 이름을 반환하지 않도록 세그먼트 생성기 수정 (#7085)
- 업로드용 controller 주기적 태스크를 추가해 세그먼트 저장소의 누락된 LLC 세그먼트 수정 (#6778)
- FileUploadDownloadClient에 반환되는 파싱 오류 메시지 수정 (#7428)
- /version 엔드포인트를 구동하는 매니페스트 스캔 수정 (#7456)
- ZK 연결로 brokerResourceEV가 null이 될 때 누락된 rate limiter 수정 (#7470)
- 세그먼트 병합/롤업과 purge(또는 convertToRawIndex) 태스크 간 경쟁 조건 수정 (#7427)
- pql 이중 인용부호 체커 예외 수정 (#7485)
- minion 메트릭스 exporter 구성 수정 (#7496)
- 세그먼트 교체 중 타임아웃 예외를 잡아 세그먼트 재시도 불가 문제 수정 (#7509)
- 모든 세그먼트를 사용할 수 없을 때 Broker 응답에 예외 추가(부분 응답) (#7397)
- 세그먼트 생성 명령 수정 (#7527)
- 예외 시 main에서 0이 아닌 값을 반환 (#7482)
- parquet 플러그인 shading 오류 수정 (#7570)
- LLC의 가장 낮은 파티션 id가 0이 아닌 문제 수정 (#7066)
- 컬럼 이름에 '.'이 포함된 star-tree 인덱스 맵 수정 (#7623)
- 클러스터 매니저 URL 인코딩 문제 수정 (#7639)
- fieldConfig nullable 검증 수정 (#7648)
- FileUploadDownloadClient의 verifyHostname 문제 수정 (#7703)
- 내장 가상 컬럼을 포함하도록 TableCache 스키마 수정 (#7706)
- AS 함수의 DISTINCT 수정 (#7678)
- DataPreprocessingHelper의 SDF 패턴 수정 (#7721)
- ParquetNativeRecordReader의 소스에서 누락된 필드 문제 수정 (#7742)