在 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.java、SeekableStreamIndexTask.java 和 SeekableStreamIndexTaskRunner.java。数据处理通过 StreamAppenderator.java 进行,而持久化和移交(hand-off)逻辑位于 StreamAppenderatorDriver.java 中。
原生批量摄取
Druid 原生批量摄取的主要任务类型基于 AbstractBatchTask.java 和 AbstractBatchSubtask.java。并行处理使用 ParallelIndexSupervisorTask.java,它会生成子任务来根据任务规范执行各种操作,例如数据分析和分区。段生成通过 BatchAppenderator 在 SinglePhaseSubTask.java、PartialHashSegmentGenerateTask.java 或 PartialRangeSegmentGenerateTask.java 中完成,而持久化和移交逻辑则位于 BatchAppenderatorDriver.java 中。
内部 UI
Druid 目前有两个内部 UI。一个用于 Coordinator,另一个用于 Overlord。
在未来的某个时候,我们可能会将内部 UI 代码从 Druid 核心中移除。
客户端库
我们欢迎为与 Druid 交互的新客户端库做出贡献。请参阅社区和第三方库页面,以获取现有客户端库的链接。