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_LENGTH chunk 압축 타입 도입 (#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)

더 알아보기 (Learn more)