0.4.0

0.4.0

Apache Pinot 0.4.0 릴리스 노트 문서예요. 이 릴리스는 theta-sketch 기반 distinct count 함수, S3 파일시스템 플러그인, 통합 star-tree 인덱스 구현, TimeFieldSpec에서 DateTimeFieldSpec으로의 마이그레이션 등을 도입했어요.

출처: 문서

본문

요약 (Summary)

0.4.0 릴리스는 theta-sketch 기반 distinct count 집계 함수, S3 파일시스템 플러그인, 통합 star-tree 인덱스 구현, TimeFieldSpec의 폐기와 DateTimeFieldSpec 선호 등 다양한 새 기능을 도입했어요. 이 릴리스에는 기타 리팩터링, 성능 개선, 버그 수정도 포함되어 있어요. 자세한 내용은 아래를 참고해 주세요.

주요 새 기능 (Notable New Features)

  • DateTimeFieldSpecs를 주류로 만들고 TimeFieldSpec 폐기 (#2756)
    • 스키마 대신 테이블 구성의 시간 컬럼 사용 (#5320)
    • Pinot Query Console의 스키마 컬럼에 dateTimeFieldSpec 포함 (#5392)
    • Pinot 테이블의 기본 시간 컬럼으로 DATE_TIME 사용 (#5399)
  • 인덱스를 사용한 범위(range) 쿼리 지원 (#5240)
  • 복잡한 집계 함수 지원
    • 여러 인자를 가진 집계 함수 지원 (#5261)
    • 컴파일된 입력 표현식을 얻기 위한 AggregationFunction의 api 추가 (#5339)
  • 간단한 PinotFS 벤치마크 드라이버 추가 (#5160)
  • 기본 star-tree 지원 (#5147)
  • theta-sketch 기반 distinct count 집계 함수의 초기 구현 추가 (#5316)
    • 사소한 부작용 하나: DataSchemaPruner가 DistinctCountThetaSketchAggregationFunction에선 동작하지 않음 (#5382)
  • Pinot 서버 세그먼트 다운로드 API에 대한 접근 제어 추가 (#5260)
  • Pinot S3 파일시스템 플러그인 추가 (#5249)
  • 텍스트 검색 개선
    • 텍스트 인덱스의 불용어(stop word) 가지치기 (#5297)
    • chunk 기반 raw 인덱스 생성자에서 8바이트 오프셋 사용 (#5285)
    • varbyte raw 인덱스 생성자에서 최대 컬럼 값 길이로 chunk당 문서 수 파생 (#5256)
    • 텍스트 검색의 세그먼트 간(inter segment) 테스트 추가 및 Lucene 쿼리 파서 생성의 버그 수정 (#5226)
    • 텍스트 인덱스 쿼리 캐시를 구성 가능한 옵션으로 변경 (#5176)
    • 성능 개선을 위해 Lucene DocId를 PinotDocId 캐시에 추가 (#5177)
    • 성능 개선을 위해 텍스트 인덱스 리더에서 두 번째 비트맵 생성 제거 (#5199)
  • 도구/사용성 개선
    • Pinot 수집 작업 스펙의 템플릿 지원 추가 (#5341)
    • 사용자가 zk 데이터 디렉터리를 지정하고 zk 종료 중 정리를 하지 않도록 허용 (#5295)
    • PinotTaskGenerator에서 minion 태스크 타임아웃 구성 허용 (#5317)
    • 스크립트의 JVM 설정 업데이트 (#5127)
    • Stream github events 데모 추가 (#5189)
    • 문서 링크를 gitbook에서 docs.pinot.apache.org로 이동 (#5193)
  • ORCRecordReader 재구현 (#5267)
  • 수집 중 스키마 변환 표현식 평가 (#5238)
  • selection 목록에서 count distinct 쿼리 처리 (#5223)
  • pinot broker 쿼리 api에서 비동기 처리 활성화 (#5229)
  • 테이블 리밸런스의 부트스트랩 모드 지원 (#5224)
  • BYTES 컬럼의 order-by 지원 (#5213)
  • 바이너리로 nightly publish 추가 (#5190)
  • 테이블 리밸런싱 시 핫스팟 서버 생성을 피하기 위해 세그먼트 셔플 (#5197)
  • 내장 변환 함수 지원 (#5312)
    • 날짜 시간 변환 함수 추가 (#5326)
  • Deepstore 우회: 세그먼트 업로더 도입 (#5277, #5314)
  • API 추가/변경
    • 세그먼트 다운로드를 위한 새 서버 api 추가
      • /GET /segments/{tableNameWithType}/{segmentName}
  • helix를 0.9.7로 업그레이드 (#5411)
  • 쿼리 컴파일 중 함수 실행 지원 추가 (#5406)
  • 기타 주요 리팩터링
    • table config를 pinot-spi로 이동 (#5194)
    • 통합 테스트 정리. 스키마, 테이블 구성, 세그먼트 생성을 표준화 (#5385)
    • json 개체에서 필드를 추출하는 jsonExtractScalar 함수 추가 (#4597)
    • Pinot 수집 작업 스펙의 템플릿 지원 추가 (#5372)
    • AggregationFunctionContext 정리 (#5364)
    • 카디널리티가 높을 때 실시간 범위 프레디킷 최적화 (#5331)
    • PinotOutputFormat이 테이블 구성과 스키마를 사용해 세그먼트를 생성하도록 변경 (#5350)
    • InstanceSelector에서 사용 불가능한 세그먼트 추적 (#5337)
    • 업로드 시간이 제한된 새 best effort 세그먼트 업로더 추가 (#5314)
    • SegmentPurger에서 테이블 구성을 사용해 세그먼트 생성 (#5325)
    • RecordReader와 StreamMessageDecoder에서 스키마 분리 (#5309)
    • 다중값 컬럼의 ARRAYLENGTH UDF 구현 (#5301)
    • GroupBy 쿼리 성능 개선 (#5291)
    • ExpressionFilterOperator 최적화 (#5132)

주요 버그 수정 (Major Bug Fixes)

  • 인덱스 닫을 때 PinotDataBuffer 해제 안 함 (#5400)
  • 쿼리 파싱과 표현식 트리에서 인자 없는 함수 처리 (#5375)
  • 알 수 없는 json 필드로 인한 롤링 업그레이드 중 호환성 문제 수정 (#5376)
  • pinot-admin 명령의 누락된 오류 메시지 수정 (#5305)
  • HDFS 복사 로직 수정 (#5218)
  • spark 수집 문제 수정 (#5216)
  • DistinctTable의 용량 수정 (#5204)
  • Pinot 웹사이트의 다양한 링크 수정

진행 중인 작업 (Work in Progress)

  • Upsert: 실시간 테이블의 데이터 덮어쓰기 지원 (#4261)
    • pinot common에 pinot upsert 기능 추가 (#5175)
  • theta-sketch 개선: 다중값 집계 지원, 복잡한 프레디킷, 성능 튜닝 등

이전 버전과 호환되지 않는 변경 (Backward Incompatible Changes)

  • TableConfig는 더 이상 중첩된 json 문자열의 json 문자열(json 안에 \" 없음) 역직렬화를 지원하지 않아요 (#5194)

  • AggregationFunction의 다음 API가 변경됨 (blockValSetMap의 키로 String 대신 TransformExpressionTree 사용) (#5371):

    void aggregate(int length, AggregationResultHolder aggregationResultHolder, Map<TransformExpressionTree, BlockValSet> blockValSetMap);
    void aggregateGroupBySV(int length, int[] groupKeyArray, GroupByResultHolder groupByResultHolder, Map<TransformExpressionTree, BlockValSet> blockValSetMap);
    void aggregateGroupByMV(int length, int[][] groupKeysArray, GroupByResultHolder groupByResultHolder, Map<TransformExpressionTree, BlockValSet> blockValSetMap);
    

더 알아보기 (Learn more)