Developing on Apache Druid
Druid's codebase consists of several major components. For developers interested in learning the code, this document provides a high level overview of the main components that make up Druid and the relevant classes to start from to learn the code.
Storage formatโ
Data in Druid is stored in a custom column format known as a segment. Segments are composed of
different types of columns. Column.java
and the classes that extend it is a great place to looking into the storage format.
Segment creationโ
Raw data is ingested in IncrementalIndex.java
, and segments are created in IndexMerger.java
.
Storage engineโ
Druid segments are memory mapped in IndexIO.java
to be exposed for querying.
Query engineโ
Most of the logic related to Druid queries can be found in the Query* classes. Druid leverages query runners to run queries.
Query runners often embed other query runners and each query runner adds on a layer of logic. A good starting point to trace
the query logic is to start from QueryResource.java
.
Coordinationโ
Most of the coordination logic for Historical processes is on the Druid Coordinator. The starting point here is DruidCoordinator.java
.
Most of the coordination logic for (real-time) ingestion is in the Druid indexing service. The starting point here is OverlordResource.java
.
Real-time Ingestionโ
Druid streaming tasks are based on the 'seekable stream' classes such as SeekableStreamSupervisor.java
,
SeekableStreamIndexTask.java
, and SeekableStreamIndexTaskRunner.java
. The data processing happens through
StreamAppenderator.java
, and the persist and hand-off logic is in StreamAppenderatorDriver.java
.
Native Batch Ingestionโ
Druid native batch ingestion main task types are based on AbstractBatchTask.java
and AbstractBatchSubtask.java
.
Parallel processing uses ParallelIndexSupervisorTask.java
, which spawns subtasks to perform various operations such
as data analysis and partitioning depending on the task specification. Segment generation happens in
SinglePhaseSubTask.java
, PartialHashSegmentGenerateTask.java
, or PartialRangeSegmentGenerateTask.java
through
BatchAppenderator
, and the persist and hand-off logic is in BatchAppenderatorDriver.java
.
Hadoop-based Batch Ingestionโ
The two main Hadoop indexing classes are HadoopDruidDetermineConfigurationJob.java
for the job to determine how many Druid
segments to create, and HadoopDruidIndexerJob.java
, which creates Druid segments.
At some point in the future, we may move the Hadoop ingestion code out of core Druid.
Internal UIsโ
Druid currently has two internal UIs. One is for the Coordinator and one is for the Overlord.
At some point in the future, we will likely move the internal UI code out of core Druid.
Client librariesโ
We welcome contributions for new client libraries to interact with Druid. See the Community and third-party libraries page for links to existing client libraries.