Controller

Controller

Apache Pinot의 controller 구성 요소가 데이터와 쿼리 관리를 어떻게 수행하는지 알아보는 페이지예요. 클러스터 메타데이터 유지, 세그먼트 관리, 주기적 태스크 운영 등 controller의 여러 책임을 파악할 수 있어요.

출처: Controller

본문

Pinot controller는 메타데이터가 변경되거나 노드가 실패할 때 Pinot 클러스터의 리소스를 스케줄링하고 재스케줄링해요. Apache Helix Controller로서 클러스터를 구성하는 리소스를 스케줄링하고 특정 외부 프로세스와 클러스터 컴포넌트 간의 연결(예: 실시간 테이블과 오프라인 테이블의 수집)을 오케스트레이션해요. Pinot controller는 자체 서버의 단일 프로세스로 배포하거나 액티브/패시브 구성의 중복 서버 그룹으로 배포할 수 있어요.

Controller는 클러스터 전체 관리 작업을 위한 REST API 엔드포인트와 대화형 SQL 쿼리, 시계열 쿼리, 간단한 관리 작업을 위한 웹 기반 쿼리 콘솔을 노출해요.

Pinot controller는 다음을 담당해요:

  • 영구 메타데이터 저장소로 사용되는 Zookeeper의 도움으로 시스템의 전역 메타데이터(예: 설정과 스키마)를 유지
  • Helix Controller를 호스팅하고 다른 Pinot 구성 요소(브로커, 서버, minion)를 관리
  • 어떤 서버가 어떤 세그먼트를 담당하는지의 매핑을 유지. 이 매핑은 서버가 담당하는 세그먼트 부분을 다운로드할 때 사용해요. 이 매핑은 브로커가 쿼리를 라우팅할 서버를 결정할 때도 사용돼요.
  • 클러스터를 관리·운영하는 데 사용되는 설정의 조회, 생성, 업데이트, 삭제를 위한 admin 엔드포인트 제공
  • 오프라인 데이터 푸시에 사용되는 세그먼트 업로드 엔드포인트 제공. 실시간 소비 초기화와 실시간 세그먼트를 세그먼트 저장소에 주기적으로 영속화하는 것을 조정할 책임이 있어요.
  • 세그먼트 보존 관리, 검증 같은 기타 관리 활동 수행

중복성을 위해 Pinot controller 인스턴스는 여러 개일 수 있어요. Pinot는 모든 controller가 동일한 백엔드 저장 시스템으로 구성되어 세그먼트에 대한 공통 뷰를 갖기를 기대해요(예: NFS). Pinot는 HDFS나 ADLS 같은 다른 저장 시스템도 사용할 수 있어요.

주기적 태스크 수동 실행 (Running the periodic task manually)

Controller는 관리와 검증 같은 활동을 수행하기 위해 백그라운드에서 여러 주기적 태스크를 실행해요. 각 주기적 태스크는 고정된 frequencyPeriod 또는 지원되는 태스크의 경우 Quartz cronExpression을 정의하는 자체 구성을 가져요. 태스크에 둘 다 설정되면 Pinot는 cron 일정을 사용해요. cron 문법과 복사 가능한 예제는 구성 레퍼런스를 참조하세요. 각 태스크는 필요 시 수동으로도 트리거할 수 있어요. 태스크는 각 테이블의 리드 controller에서 실행돼요.

주기적 태스크 구성에 대한 자세한 내용은 Controller 구성 레퍼런스를 참조하세요.

GET /periodictask/names API를 사용해 Pinot 클러스터에서 실행 중인 모든 주기적 태스크의 이름을 가져올 수 있어요.

curl -X GET "http://localhost:9000/periodictask/names" -H "accept: application/json"

[
  "RetentionManager",
  "OfflineSegmentIntervalChecker",
  "RealtimeSegmentValidationManager",
  "BrokerResourceValidationManager",
  "SegmentStatusChecker",
  "SegmentRelocator",
  "StaleInstancesCleanupTask",
  "TaskMetricsEmitter"
]

이름이 있는 주기적 태스크를 수동으로 실행하려면 GET /periodictask/run API를 사용해요:

curl -X GET "http://localhost:9000/periodictask/run?taskname=SegmentStatusChecker&tableName=jsontypetable&type=OFFLINE" -H "accept: application/json"

{
  "Log Request Id": "api-09630c07",
  "Controllers notified": true
}

Log Request Id(api-09630c07)는 수동으로 실행한 Periodic 태스크 실행과 관련된 로그 항목을 찾기 위해 pinot-controller 로그 파일을 검색하는 데 사용할 수 있어요.

tableName(그리고 유형 OFFLINE 또는 REALTIME)이 제공되지 않으면 태스크는 모든 테이블에 대해 실행돼요.

Controller 시작 (Starting a controller)

Zookeeper를 설정했는지 확인하세요. Docker를 사용한다면 Pinot Docker 이미지를 받아두세요. controller를 시작하려면:

Docker 이미지:

docker run \
    --network=pinot-demo \
    --name pinot-controller \
    -p 9000:9000 \
    -d ${PINOT_IMAGE} StartController \
    -zkAddress pinot-zookeeper:2181

런처 스크립트:

bin/pinot-admin.sh StartController \
  -zkAddress localhost:2181 \
  -clusterName PinotCluster \
  -controllerPort 9000

더 알아보기 (Learn more)