쿼리 처리

쿼리 처리 (Query processing)

Apache Druid가 쿼리를 어떻게 분산하고 처리하는지에 대해 높은 수준에서 개괄적으로 설명하는 문서예요. 브로커(Broker)가 쿼리를 받아 세그먼트를 찾고, 각 서비스가 부분 결과를 처리한 뒤 다시 합치는 흐름을 차근차근 살펴볼게요.

출처: 문서

본문

이 주제에서는 Apache Druid가 쿼리를 어떻게 분산하고 처리하는지에 대한 높은 수준의 개요를 제공해요.

전체 흐름은 다음과 같아요:

  1. 쿼리가 Broker 서비스에 들어오면, Broker는 해당 쿼리와 관련된 데이터가 있을 수 있는 세그먼트를 식별해요. 세그먼트 목록은 항상 시간으로 정리(prune)되고, datasource가 어떻게 파티셔닝되어 있는지에 따라 다른 속성으로도 정리될 수 있어요.
  2. Broker는 어떤 Historical·Middle Manager 서비스가 그 세그먼트들을 서빙하고 있는지 식별하고, 각 서비스에 다시 작성된 서브쿼리(rewritten subquery)를 분배해요.
  3. Historical·Middle Manager 서비스는 각 서브쿼리를 실행하고 결과를 Broker로 돌려줘요.
  4. Broker는 부분 결과들을 병합해 최종 답을 얻고, 이를 원래 호출자에게 돌려줘요.

Druid는 시간·속성 정리(pruning)를 사용해 각 쿼리에 대해 스캔해야 하는 데이터를 최소화해요.

Broker가 정리에 사용하는 것보다 더 정밀한 필터의 경우, 각 세그먼트 안의 인덱싱 구조 덕분에 Historical 서비스가 데이터에 접근하기 전에 일치하는 행을 식별할 수 있어요. Historical 서비스는 특정 쿼리에 어떤 행이 일치하는지 알게 된 뒤에 필요한 행과 열만 접근해요.

쿼리 성능을 최대화하기 위해 Druid는 다음 기법을 사용해요:

  • 쿼리에 대해 접근하는 세그먼트의 집합을 정리(prune)해요.
  • 각 세그먼트 안에서, 접근해야 하는 행을 식별하기 위해 인덱스를 사용해요.
  • 각 세그먼트 안에서, 특정 쿼리와 관련된 행과 열만 읽어요.

더 알아보기 (Learn more)

더 자세한 내용은 다음 주제를 참고하세요:

  • 쿼리 실행 (Query execution) — Druid 서비스가 쿼리 문장을 어떻게 처리하는지 알아볼게요.