以下是为初级大数据开发工程师设计的Doris源码阅读与社区贡献结构化计划,结合Doris的架构特点和Apache社区要求,分阶段从源码理解到实际贡献:
阶段1:基础准备(1-2周)
目标
- 理解Doris的核心架构与组件职责
- 搭建源码编译、调试和测试环境
具体步骤
-
技术栈准备
- 语言基础 :
- FE(Frontend):Java(JDK 11+)、SQL解析(ANTLR)
- BE(Backend):C++(C++17)、列式存储(Apache Arrow)、向量化执行
- 必学工具 :
- Git:分支管理、代码提交规范
- Maven (FE编译)、CMake(BE编译)
- IDE:IntelliJ IDEA(FE调试)、CLion/VSCode(BE调试)
- Docker:快速部署Doris测试集群
- 语言基础 :
-
Doris架构总览
- 核心组件 :
- FE:负责元数据管理、查询解析(Master/Follower/Observer角色)
- BE:负责数据存储、查询执行(分布式存储与MPP计算)
- Broker:外部存储接入(HDFS/S3等)
- 关键特性 :
- 列式存储(Segment V2格式)、向量化执行引擎、物化视图
- 学习资源 :
- Doris官方文档
- 《Doris设计与实现》社区技术博客
- 核心组件 :
-
源码下载与编译
bash# 克隆源码 git clone https://github.com/apache/doris.git cd doris git checkout branch-2.0 # 选择稳定分支(如2.0.x) # 编译FE(Java) cd fe mvn clean package -DskipTests # 编译BE(C++) cd ../be ./build.sh --clean --build-type=Release
阶段2:源码阅读计划(8-12周)
目标
- 深入理解FE的SQL解析、元数据管理与BE的存储/查询执行逻辑
- 掌握Doris的核心设计模式(如向量化执行、分布式事务)
阅读顺序与重点
第1-4周:FE源码精读(Java)
-
SQL解析与查询规划
- 源码路径 :
fe/fe-core/src/main/java/org/apache/doris/analysis
- 关键流程 :
- SQL解析:
SqlScanner
和SqlParser
(基于ANTLR生成的语法树) - 逻辑计划生成:
Analyzer
、QueryStmt
- 优化器:
Cascades Optimizer
(基于规则的RBO与基于代价的CBO)
- SQL解析:
- 源码路径 :
-
元数据管理
- 源码路径 :
fe/fe-core/src/main/java/org/apache/doris/catalog
- 关键类 :
Catalog
:元数据全局管理(表、分区、副本状态)OlapTable
:表结构定义(分区分桶、副本分布)
- 关键机制 :
- 元数据同步:FE节点间的元数据高可用(基于BDB-JE)
- 源码路径 :
-
查询调度与协调
- 源码路径 :
fe/fe-core/src/main/java/org/apache/doris/qe
- 关键类 :
Coordinator
:查询任务的拆分与BE节点调度QueryPlan
:分布式执行计划生成
- 源码路径 :
第5-8周:BE源码精读(C++)
-
存储引擎
- 源码路径 :
be/src/olap
- 关键模块 :
- Segment V2 :列式存储格式(
SegmentReader
、PageIO
) - Compaction:数据合并机制(Base Compaction vs Cumulative Compaction)
- Tablet管理:数据分片(Tablet)的版本管理与副本同步
- Segment V2 :列式存储格式(
- 源码路径 :
-
查询执行引擎
- 源码路径 :
be/src/exec
、be/src/vec
- 关键特性 :
- 向量化执行 :
Block
数据结构、向量化算子(HashJoinNode
、AggregationNode
) - MPP执行 :
ExchangeNode
(数据Shuffle)、Pipeline执行模型
- 向量化执行 :
- 源码路径 :
-
资源管理与RPC通信
- 源码路径 :
be/src/runtime
、be/src/service
- 关键类 :
FragmentMgr
:查询Fragment的生命周期管理PBackendService
:BE与FE的Thrift RPC接口实现
- 源码路径 :
第9-12周:高级特性与工具链
-
物化视图与索引
- 源码路径 :
fe/fe-core/src/main/java/org/apache/doris/materview
- 实现机制:物化视图的自动选择与增量刷新
- 源码路径 :
-
监控与调试工具
- FE:Web UI(端口8030)的元数据展示
- BE :
http://be_ip:8040
的Metrics接口、pprof
性能分析
阶段3:实践与社区贡献(持续进行)
目标
- 通过修复Bug和优化功能参与社区贡献
- 掌握Apache Doris社区的协作规范
具体步骤
-
社区入门
- 订阅邮件列表 :
- dev@doris.apache.org
- 跟踪JIRA任务:Doris JIRA
- 筛选适合新手的任务 :
- JIRA标签:
starter
、newcomer
、easy
- 示例任务:
- 修复文档中的错误(如配置项描述不准确)
- 补充单元测试(FE的
AnalyzerTest
或BE的StorageEngineTest
)
- JIRA标签:
- 订阅邮件列表 :
-
贡献流程
- 代码修改 :
- 遵循代码规范:
- FE:Google Java Style Guide
- BE:Google C++ Style Guide
- 本地测试:通过
run-fe-ut.sh
和run-be-ut.sh
运行单元测试
- 遵循代码规范:
- 提交补丁 :
- 生成Patch文件:
git format-patch -1 HEAD
- 提交到JIRA:附上测试结果和修改说明
- 生成Patch文件:
- 社区Review :
- 根据社区反馈迭代修改(可能需要多次Review)
- 代码修改 :
-
高质量贡献方向
- 性能优化 :
- 分析BE的CPU热点(使用
perf
或pprof
) - 示例:优化向量化算子的内存分配(如预分配
Block
内存池)
- 分析BE的CPU热点(使用
- 功能增强 :
- 实现简单的UDF函数(如新增字符串处理函数)
- 支持新的数据导入格式(如JSON Lines)
- 性能优化 :
工具与调试技巧
-
FE调试(Java)
-
远程调试 :
bash# 启动FE时添加JVM参数 export JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" ./fe/bin/start_fe.sh --daemon
- 在IntelliJ IDEA中配置Remote Debug(端口5005)
-
-
BE调试(C++)
-
GDB调试 :
bashgdb --args ./be/lib/doris_be --port=9060
-
日志分析 :
- BE日志路径:
be/log/be.INFO
- 调整日志级别:修改
be/conf/be.conf
中的sys_log_level=DEBUG
- BE日志路径:
-
学习资源推荐
- 官方资源
- 书籍与课程
- 《Doris实时数仓实战》(社区推荐)
- 极客时间:《深入剖析Apache Doris》
- 社区案例
- 美团、字节跳动等公司的Doris优化实践分享
注意事项
- 避免过早深入复杂模块 :
- 初期避免直接修改分布式事务(如Schema Change)或查询优化器核心逻辑。
- 小步验证 :
- 每修改一个功能点后,立即运行相关单元测试和集成测试。
- 社区沟通礼仪 :
- 在邮件列表提问时,附上错误日志、复现步骤和已尝试的解决方法。
- 提交代码时注明关联的JIRA编号(如
DORIS-XXXX
)。
通过此计划,你可以逐步掌握Doris源码的核心逻辑,并在3-6个月内成为Apache Doris社区的活跃贡献者。建议每周投入10-15小时,结合实践与理论,持续积累经验。