Apache Druid 개발 개요
Apache Druid 개발 개요
Druid의 코드베이스는 여러 주요 컴포넌트로 이루어져 있어요. 이 문서는 코드를 배우고 싶은 개발자를 위해 Druid를 구성하는 주요 컴포넌트들의 큰 그림과, 각 부분을 공부할 때 시작점으로 삼으면 좋은 클래스를 정리해 드립니다.
출처: 문서
본문
저장 형식 (Storage format)
Druid의 데이터는 세그먼트(segment)라고 부르는 자체적인 컬럼 형식으로 저장돼요. 세그먼트는 여러 종류의 컬럼으로 구성되며, Column.java와 이를 상속하는 클래스들이 저장 형식을 살펴보기에 좋은 출발점입니다.
세그먼트 생성 (Segment creation)
원시 데이터는 IncrementalIndex.java에서 수집(ingest)되고, 세그먼트는 IndexMerger.java에서 만들어져요.
저장 엔진 (Storage engine)
Druid 세그먼트는 쿼리를 위해 IndexIO.java에서 메모리 매핑(메모리 맵)돼요.
쿼리 엔진 (Query engine)
Druid 쿼리와 관련된 대부분의 로직은 Query* 계열 클래스에서 찾을 수 있어요. Druid는 쿼리 러너(query runner)를 사용해서 쿼리를 실행하는데, 쿼리 러너는 흔히 다른 쿼리 러너를 감싸며 각 러너가 한 겹씩 로직을 더해가는 구조예요. 쿼리 로직을 따라가 보기 좋은 시작점은 QueryResource.java입니다.
코디네이션 (Coordination)
Historical 프로세스의 코디네이션 로직 대부분은 Druid Coordinator에 있어요. 여기의 시작점은 DruidCoordinator.java예요. (실시간) 수집 관련 코디네이션 로직은 주로 Druid indexing service에 있는데, 이쪽 시작점은 OverlordResource.java입니다.
실시간 수집 (Real-time Ingestion)
Druid 스트리밍 태스크는 SeekableStreamSupervisor.java, SeekableStreamIndexTask.java, SeekableStreamIndexTaskRunner.java 같은 'seekable stream' 클래스들을 기반으로 해요. 데이터 처리는 StreamAppenderator.java에서 이루어지고, persist와 hand-off 로직은 StreamAppenderatorDriver.java에 있습니다.
네이티브 배치 수집 (Native Batch Ingestion)
Druid 네이티브 배치 수집의 주요 태스크 타입은 AbstractBatchTask.java와 AbstractBatchSubtask.java를 기반으로 해요. 병렬 처리는 ParallelIndexSupervisorTask.java가 담당하며, 이 태스크는 태스크 명세에 따라 데이터 분석·파티셔닝 같은 여러 작업을 수행하는 서브태스크들을 만들어 냅니다. 세그먼트 생성은 SinglePhaseSubTask.java, PartialHashSegmentGenerateTask.java, PartialRangeSegmentGenerateTask.java에서 BatchAppenderator를 통해 이루어지고, persist와 hand-off 로직은 BatchAppenderatorDriver.java에 있어요.
내부 UI (Internal UIs)
Druid에는 현재 두 개의 내부 UI가 있어요. 하나는 Coordinator용이고, 다른 하나는 Overlord용입니다. 언젠가 이 내부 UI 코드는 Druid 코어 밖으로 옮겨질 가능성이 높아요.
클라이언트 라이브러리 (Client libraries)
Druid와 상호작용하는 새로운 클라이언트 라이브러리 기여를 환영합니다. 기존 클라이언트 라이브러리 링크는 Community and third-party libraries 페이지에서 확인할 수 있어요.
더 알아보기 (Learn more)
- Druid 개발 문서 — Druid 개발과 관련된 각종 가이드
- Community 및 서드파티 라이브러리 — 기존 클라이언트 라이브러리 목록
- Druid 모듈 문서 — 모듈 구조와 확장 방법