0.3.0

0.3.0

Apache Pinot 0.3.0 릴리스 노트 문서예요. 이 릴리스는 다른 시스템과 쉽게 확장·연동할 수 있게 해주는 플러그인 개념을 도입해요.

출처: 문서

본문

무엇이 크게 바뀌었나요? (What's the big change?)

이전 릴리스(0.2.0)와 이 릴리스(0.3.0)의 아키텍처 변경 배경은 Apache Pinot 확장 가능성 때문이에요. 0.2.0 릴리스는 새로운 스토리지 타입이나 새로운 스트림 타입을 지원하기에 충분히 유연하지 않았어요. 기본적으로 새 기능을 추가하려면 너무 많은 코드를 변경해야 했죠. 그래서 Pinot 팀은 소스 코드에 대한 광범위한 리팩터링과 개선을 진행했어요.

예를 들어, 아래 그림은 0.2.X 및 이전 릴리스의 모듈 의존성을 보여줘요. 새로운 스토리지 타입을 지원하려면 여러 모듈을 변경해야 했어요. 꽤 안 좋았죠?

0.2.0 및 이전 Pinot 모듈 의존성 다이어그램

이 과제를 해결하기 위해 다음과 같은 주요 변경이 이루어졌어요:

  • 공통 인터페이스를 pinot-spi 모듈로 리팩터링
  • 네 가지 유형의 모듈을 정의:
    • Pinot 입력 형식: 다양한 데이터/파일 형식(예: Avro/CSV/JSON/ORC/Parquet/Thrift)에서 레코드를 읽는 방법
    • Pinot 파일시스템: 다양한 파일시스템(예: Azure Data Lake/Google Cloud Storage/S3/HDFS)에서 파일을 운영하는 방법
    • Pinot 스트림 수집: Kafka/Kinesis/Eventhub 같은 다양한 업스트림 시스템에서 데이터 스트림을 수집하는 방법
    • Pinot 배치 수집: Standalone, Hadoop, Spark 같은 다양한 프레임워크에서 Pinot 배치 수집 작업을 실행하는 방법
  • 각 개별 플러그인에 대한 shaded jar 빌드
  • 서버 시작 시 pinot 플러그인 동적 로드 지원 추가

이제 아키텍처는 플러그 앤 플레이(plug-and-play) 방식을 지원하며, 큰 코드 덩어리에 영향을 주지 않으면서 작고 간단한 확장만으로 새 도구를 지원할 수 있어요. 새 스트리밍 서비스와 데이터 형식과의 통합을 훨씬 더 간단하고 편리하게 개발할 수 있어요.

0.3.0에서 pinot-plugin 도입 후 의존성 그래프

주요 새 기능 (Notable New Features)

  • SQL 지원
    • Calcite SQL 컴파일러 추가
    • SQL 응답 형식 추가 (#4694, #4877)
    • GROUP BY와 함께 ORDER BY 지원 (#4602)
    • 쿼리 콘솔이 기본적으로 SQL 문법 사용 (#4994)
    • 컬럼 별칭(alias) 지원 (#5016, #5033)
    • SQL 쿼리 엔드포인트 /query/sql 추가 (#4964)
    • 산술 연산자 지원 (#5018)
    • 프레디킷 비교에서 오른쪽 피연산자에 비-리터럴 표현식 지원 (#5070)
  • DISTINCT 지원 추가 (#4535)
  • BYTES 컬럼의 기본값 지원 (#4583)
  • JDK 11 지원
  • 근사 집계 함수(DistinctCountHLL, PercentileEst, PercentileTDigest)의 크기 대 정확도 조정 지원 (#4666)
  • Data Anonymizer 도구 추가 (#4747)
  • pinot-hadoop과 pinot-spark 모듈 폐기, pinot-batch-ingestion-hadoop과 pinot-batch-ingestion-spark로 대체
  • 실시간 consuming 세그먼트의 사전(dictionary) 없는 컬럼에서 STRING과 BYTES 지원 (#4791)
  • pinot-distribution이 pinot-all jar를 만들고 어셈블하도록 변경 (#4977)
  • PQL 대소문자 구분 안 함 지원 (#4983)
  • TableRebalancer 로직 강화
    • 새 리밸런스 전략으로 이동 (#4695)
    • 어떤 조건에서도 테이블 리밸런싱 지원 (#4990)
    • LLC 실시간 테이블의 Consuming 세그먼트와 함께 완료된 세그먼트 재할당 지원 (#5015)
  • 텍스트 검색(Text Search) 실험적 지원 (#4993)
  • Helix를 버전 0.9.4로 업그레이드, 태스크 관리가 예상대로 동작 (#5020)
  • date_trunc 변환 함수 추가 (#4740)
  • consuming 세그먼트의 스키마 진화 지원 (#4954)
  • API 추가/변경
    • Pinot Admin 명령
      • PinotAdmin PostQuery 하위 명령에 -queryType 옵션 추가 (#4726)
      • AddTable 명령에 -schemaFile 옵션 추가 (#4959)
      • PinotAdmin에 OperateClusterConfig 하위 명령 추가 (#5073)
    • Pinot Controller REST API
      • 테이블 리더 컨트롤러 리소스 가져오기 (#4545)
      • HTTP POST/PUT으로 JSON 인코딩 스키마 업로드 지원 (#4639)
      • 테이블 리밸런스 API가 이제 테이블 이름과 타입을 모두 매개변수로 요구 (#4824)
      • Segments API 리팩터링 (#4806)
      • 세그먼트 일괄 삭제 REST API 추가 (#4828)
      • 스키마 변경 시 해당되는 경우 테이블을 리로드하도록 schema API 업데이트 (#4838)
      • 태스크 관련 REST API 강화 (#5054)
      • PinotClusterConfig REST API 추가 (#5073)
        • GET /cluster/configs
        • POST /cluster/configs
        • DELETE /cluster/configs/{configName}
  • 구성 추가/변경
    • Pinot Controller에서 controller.host 구성이 이제 선택 사항
    • 실행 중인 서버로의 쿼리 전송을 비활성화하는 인스턴스 구성 queriesDisabled 추가 (#4767)
    • 브로커 구성 pinot.broker.enable.query.limit.override — 구성 가능한 최대 쿼리 응답 크기 (#5040)
    • 폐기된 서버 구성 제거 (#4903)
      • pinot.server.starter.enableSegmentsLoadingCheck
      • pinot.server.starter.timeoutInSeconds
      • pinot.server.instance.enable.shutdown.delay
      • pinot.server.instance.starter.maxShutdownWaitTime
      • pinot.server.instance.starter.checkIntervalTime
    • 서버 인스턴스 id를 hostname/port 구성과 분리 (#4995)
    • 필드에 대한 인코딩·인덱싱 정보를 캡슐화하는 FieldConfig 추가 (#5006)

주요 버그 수정 (Major Bug Fixes)

  • 세그먼트에 작업하는 스레드가 여전히 있을 때 세그먼트를 해제하는 버그 수정 (#4764)
  • 스레드의 고르지 못한 태스크 분배 버그 수정 (#4793)
  • .tar.gz 세그먼트 파일 업로드의 암호화 수정 (#4855)
  • 비로컬 파일시스템에서 세그먼트를 다운로드하는 controller rest API 수정 (#4808)
  • 세그먼트 복구가 예외를 던질 때 세그먼트 잠금을 해제하지 않는 버그 수정 (#4882)
  • Helix 매니저에 연결하기 전에 서버가 상태 모델 팩토리를 등록하지 않는 문제 수정 (#4929)
  • Helix가 새 ZK 세션을 시작할 때 서버 인스턴스의 예외 수정 (#4976)
  • ExpressionFilterOperator의 ThreadLocal DocIdSet 문제 수정 (#5114)
  • 기본값 제공자 클래스의 버그 수정 (#5137)
  • RealtimeSegmentSelector에서 세그먼트가 없을 때의 버그 수정 (#5138)

진행 중인 작업 (Work in Progress)

  • 텍스트 검색 쿼리 기능을 지원하는 과정 중
  • null 값 지원 과정 중 (#4230), 현재 제한된 쿼리 기능이 지원됨
    • null 값을 나타내는 Presence Vector 추가 (#4585)
    • 리프 프레디킷에 대한 null 프레디킷 지원 추가 (#4943)

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

  • Pinot Broker와 Pinot Server 사이의 프로토콜 변경 때문에 0.1.0 버전에서 이 버전으로의 업그레이드는 파괴적이에요. 먼저 0.2.0 릴리스로 업그레이드한 뒤 이 버전으로 업그레이드해야 해요.

  • Pinot-distribution 모듈에서 생성된 스크립트를 사용하지 않고 자체 startable 또는 war를 빌드한다면, Java 8의 경우 Pinot이 모든 Pinot 플러그인 jar를 로드할 위치를 찾기 위해 환경 변수 "plugins.dir"이 필요해요. Java 11에서는 plugins 디렉터리를 classpath에 명시적으로 설정해야 해요. pinot-admin.sh를 예시로 참고해 주세요.

  • 언제나 그렇듯, 생산 클러스터에서 무중단을 위해 컨트롤러를 먼저 업그레이드하고, 그다음 브로커, 마지막으로 서버 순서로 업그레이드하는 것을 권장해요.

  • Kafka 0.9는 더 이상 릴리스 배포판에 포함되지 않아요.

  • Pull Request #4806는 세그먼트 관리에 이전 버전과 호환되지 않는 API 변경을 도입해요.

    • 세그먼트 토글 API 제거
    • 클러스터의 모든 세그먼트 나열 API 제거
    • 아래 API 폐기:
      • GET /tables/{tableName}/segments
      • GET /tables/{tableName}/segments/metadata
      • GET /tables/{tableName}/segments/crc
      • GET /tables/{tableName}/segments/{segmentName}
      • GET /tables/{tableName}/segments/{segmentName}/metadata
      • GET /tables/{tableName}/segments/{segmentName}/reload
      • POST /tables/{tableName}/segments/{segmentName}/reload
      • GET /tables/{tableName}/segments/reload
      • POST /tables/{tableName}/segments/reload
  • Pull Request #5054는 아래 태스크 관련 API를 폐기해요:

    • GET:
      • /tasks/taskqueues: 모든 태스크 큐 나열
      • /tasks/taskqueuestate/{taskType} → /tasks/{taskType}/state
      • /tasks/tasks/{taskType} → /tasks/{taskType}/tasks
      • /tasks/taskstates/{taskType} → /tasks/{taskType}/taskstates
      • /tasks/taskstate/{taskName} → /tasks/task/{taskName}/taskstate
      • /tasks/taskconfig/{taskName} → /tasks/task/{taskName}/taskconfig
    • PUT:
      • /tasks/scheduletasks → POST /tasks/schedule
      • /tasks/cleanuptasks/{taskType} → /tasks/{taskType}/cleanup
      • /tasks/taskqueue/{taskType}: 태스크 큐 토글
    • DELETE:
      • /tasks/taskqueue/{taskType} → /tasks/{taskType}
  • pinot-hadoop과 pinot-spark 모듈을 폐기하고 pinot-batch-ingestion-hadoop과 pinot-batch-ingestion-spark로 대체.

  • 세그먼트 생성 작업과 세그먼트 push 작업을 정의하는 새로운 Pinot 배치 수집 작업과 yaml 기반 작업 스펙 도입.

  • 클러스터 업그레이드 중 pinot-broker에서 아래와 같은 예외가 보일 수 있지만 무시해도 안전해요.

    2020/03/09 23:37:19.879 ERROR [HelixTaskExecutor] ...
    java.lang.UnsupportedOperationException: Unsupported user defined message sub type: REFRESH_SEGMENT
    

더 알아보기 (Learn more)