跳转到主要内容

在 Apache Druid 上进行开发

Druid 的代码库包含几个主要组件。对于有兴趣学习代码的开发人员,本文档概述了构成 Druid 的主要组件,并提供了学习代码时应参考的相关类。

存储格式

Druid 中的数据以一种称为 segment(段)的自定义列式格式存储。段由不同类型的列组成。Column.java 及其子类是深入了解存储格式的最佳切入点。

段创建

原始数据在 IncrementalIndex.java 中进行摄取,段则在 IndexMerger.java 中创建。

存储引擎

Druid 段在 IndexIO.java 中进行内存映射,以便提供查询。

查询引擎

大多数与 Druid 查询相关的逻辑可以在 Query* 类中找到。Druid 利用查询运行器(Query runners)来执行查询。查询运行器通常会嵌入其他查询运行器,每个查询运行器都会增加一层逻辑。追踪查询逻辑的一个很好的起点是 QueryResource.java

协调

Historical 进程的大多数协调逻辑都在 Druid Coordinator 中。这里的起点是 DruidCoordinator.java。(实时)摄取的协调逻辑大部分在 Druid 索引服务中。这里的起点是 OverlordResource.java

实时摄取

Druid 流式任务基于“可寻址流”(seekable stream)类,例如 SeekableStreamSupervisor.javaSeekableStreamIndexTask.javaSeekableStreamIndexTaskRunner.java。数据处理通过 StreamAppenderator.java 进行,而持久化和移交(hand-off)逻辑位于 StreamAppenderatorDriver.java 中。

原生批量摄取

Druid 原生批量摄取的主要任务类型基于 AbstractBatchTask.javaAbstractBatchSubtask.java。并行处理使用 ParallelIndexSupervisorTask.java,它会生成子任务来根据任务规范执行各种操作,例如数据分析和分区。段生成通过 BatchAppenderatorSinglePhaseSubTask.javaPartialHashSegmentGenerateTask.javaPartialRangeSegmentGenerateTask.java 中完成,而持久化和移交逻辑则位于 BatchAppenderatorDriver.java 中。

内部 UI

Druid 目前有两个内部 UI。一个用于 Coordinator,另一个用于 Overlord。

在未来的某个时候,我们可能会将内部 UI 代码从 Druid 核心中移除。

客户端库

我们欢迎为与 Druid 交互的新客户端库做出贡献。请参阅社区和第三方库页面,以获取现有客户端库的链接。