


课 程 介 绍

亲爱的各位小伙伴们,大家期待已久的直播课程终于要跟大家见面了!
《 Apache Doris 源码阅读与解析》系列直播活动旨在帮助 Apache Doris 社区的开发者或者有意向参与 Apache Doris 社区建设的小伙伴们,可以更快熟悉 Apache Doris 代码的组织结构和一些主要流程的实现原理以及代码位置,以便于各位小伙伴们能够快速上手,参与到开发工作中来。
本系列直播课程暂定分为 10 次课程,涵盖了 Apache Doris 中大部分重点流程的讲解,包括建表语句执行、数据写入、SQL执行、数据读取、查询优化器以及元数据管理等。

课 程 正 文

本期课程《从零认识 Doris 代码库》为 Apache Doris 源码解析系列直播课程 的第 0 讲,作为导读文章来帮助开发者从整体角度了解 Apache Doris 的代码结构和开发流程,以便后续能够更快上手参与 Doris 的代码开发。
Doris 源码的获取及提交
Doris 开发环境的搭建
Doris 系统架构简述
Doris 代码目录结构说明
Doris 代码合入准则
01 Apache Doris 源码的获取及提交
这里我们直接参阅 Apache Doris 官网的 代码提交指南 即可,链接:
http://doris.incubator.apache.org/master/zh-CN/community/pull-request.html
02 Apache Doris 开发环境搭建
Doris 的代码主要是语言为 Java 和 C++。其中 FE 模块主要由 Java 编写,而 BE 模块主要由 C++ 编写。这里我们分别就 FE 和 BE 的开发环境进行说明。
FE 开发环境
FE 中的 Java 代码由 Maven 进行管理。这里我们推荐使用 IntelliJ IDEA 进行开发,
IntelliJ IDEA 的开发环境搭建可以参阅 官方文档 ,链接:
http://doris.incubator.apache.org/master/zh-CN/developer-guide/fe-idea-dev.html
在工程创建完成后,建议配置 IDEA 的如下两个功能,以方便通过代码格式检查:
Editor -> Code Style -> Java 中配置 Imports Order。
Imports Order 的具体顺序可参阅 官方文档 ,链接:
http://doris.incubator.apache.org/master/zh-CN/developer-guide/java-format-code.html#import-order
在
Save Actions
设置保存时自动格式化。建议在格式化选项中仅勾选
Optimize imports
和Reformat only changed code
。以保证 Import 顺序,以及不会自动格式化其他未变更的代码。
BE 开发环境
BE 开发环境请参阅 官方文档 ,链接:
http://doris.incubator.apache.org/master/zh-CN/developer-guide/be-vscode-dev.html
BE 的代码自动格式化请参阅 官网文档 ,链接:
http://doris.incubator.apache.org/master/zh-CN/developer-guide/cpp-format-code.html#
cd incubator-doris/.git/hooks创建文件
pre-commit
内容如下:
1234567891011121314151617181920 | #!/bin/bashformat_file() { file="${1}" if [ -f $file ]; then clang-format -i -style=file ${1} git add ${1} fi}case "${1}" in --about ) echo "Runs clang-format on source files" ;; * ) for file in `git diff-index --cached --name-only HEAD | grep -iE '\.(cpp|cc|h|hpp)$' ` ; do format_file "${file}" done ;;esac |
修改
pre-commit
文件权限:chmod +x pre-commit
, 之后在 git commit 的时候就会自动格式化变更的代码了。
03 Apache Doris 系统架构简述

如上图,Doris 主要有两类进程:Frontend(FE) 和 Backend(BE) 。
Frontend
接收用户连接请求(MySQL 协议层) 元数据存储与管理 查询语句的解析与查询计划的执行 集群管控
Backend
数据存储与管理
查询计划的执行
04 Apache Doris 代码目录结构说明
这里我们从根目录说起,以 commit b3ae607f 为例:
123456789101112131415161718192021222324252627282930 | ├── be BE 代码目录├── bin FE/BE 的启停脚本├── build_plugin.sh FE 插件编译脚本├── build.sh Doris 编译脚本├── build-support 编译用辅助脚本├── CODE_OF_CONDUCT.md 贡献者代码行为准则├── conf FE/BE 的配置文件├── contrib 第三方贡献代码,如 udf├── CONTRIBUTING_CN.md ├── CONTRIBUTING.md├── DISCLAIMER├── docker Doris 开发镜像的 Dockerfile├── docs 文档目录├── env.sh├── extension 扩展功能代码,如 flink connector 等├── fe FE 代码目录├── fe_plugins FE 插件目录├── fs_brokers Broker 代码目录├── gensrc thrift/protobuf 等代码生成目录├── LICENSE.txt├── NOTICE.txt├── README.md├── run-be-ut.sh BE 单元测试运行脚本├── run-fe-ut.sh FE 单元测试运行脚本├── samples 示例代码目录├── thirdparty 第三方依赖库目录├── tools 一些辅助工具├── tsan_suppressions├── ui FE 前端代码目录└── webroot 一些静态网页相关代码 |
这里我们主要介绍 fe/ be/ gensrc/ extension/ 四个目录。
fe/
12345678 | ├── checkstyle-apache-header.txt├── checkstyle.xml├── conf├── fe-common 一些 FE 模块的通用代码├── fe-core FE 模块主代码├── pom.xml├── README└── spark-dpp Spark Load 所依赖的 Spark 导入程序代码 |
fe-core 为 FE 的核心代码模块
12345678 | ├── main │ ├── cup 语法定义文件│ ├── java 主代码│ ├── jflex 词法定义文件│ └── resources└── test 单元测试 ├── java └── resources |
在 main/java/org/apache/doris/
下即是 FE 代码的主要部分了:
123456789101112131415161718192021222324252627282930313233 | ├── alter 表结构变更操作相关的代码。包括表结构变更,物化视图等。├── analysis 包含所有SQL语法的java实例类├── backup 备份恢复操作相关的代码├── blockrule SQL 黑名单相关代码├── catalog 包含元数据操作的主类和各种数据库、表、分区的元数据实例类├── clone 数据副本修复和均衡相关的代码├── cluster 已废弃├── common 一些工具类和通用定义├── consistency 数据一致性校验相关的代码├── deploy 部署相关代码├── external Doris on Elasticsearch相关的代码├── ha 元数据高可用相关的代码├── http http v1 代码├── httpv2 http v2 代码(逐步替换v1)├── journal 元数据日志相关的代码├── ldap LDAP 认证相关代码├── load 导入作业相关代码 |
be/
1 | ├── CMakeLists.txt // CMake 编译文件 |
主代码目录包含:
1 | ├── agent // FE 下发的 agent task 相关处理类 |
gensrc/
1 | ├── Makefile |
extension
extension/
1 | ├── DataX // DataX doriswriter 插件 |
05 Apache Doris 代码合入准则
开发者在本地修改完代码后,需要完成以下几个步骤,方可提交代码:
运行
run-fe-ut.sh
和run-be-ut.sh
来运行单元测试并确认通过。提交 Pull Request
Pull Request 会触发准入测试:
1.
Travis CI/continuous-integration
:文档编译准入。会对docs/
目录进行编译2.
ut_build
:单元测试准入。会运行 fe/be 单元测试。3.
NewDorisTest
:一个包含100多个 case 的最小回归测试集。
只有在以上准入测试都通过,并且有至少一个 Committer Approve 后,代码方可合入。
06 结语
以上就是本系列课程的开篇。希望能够帮助大家对 Doris 项目有个宏观的认识。

下 期 预 告

用户请求的入口函数在哪里
一个 DDL 语句是如何解析等
Doris 元数据的修改和持久化
建表任务的创建以及 FE 与 BE 之间的任务交互过程
下期课程预计将于 9 月 29 日晚 19 点开始,课程时长约 30 分钟,届时我们将提前通过 ApacheDoris 微信公众号发出直播链接,欢迎大家持续关注。
如果各位小伙伴有其他想了解的模块,欢迎在微信公众号后台向我们留言,也可以点击文末阅读原文填写调查问卷,我们将会另行安排大家感兴趣的模块进行讲解。
活动预告|Apache Doris 源码阅读与解析系列直播 深度解析|Apache Doris 索引机制解析 最佳实践|Apache Doris Join 实现与调优实践 社区活动| Apache Doris 社区征文活动邀您参加~
欢迎扫码关注:

Apache Doris(incubating)官方公众号
相关链接:
Apache Doris官方网站:
http://doris.incubator.apache.org
Apache Doris Github:
https://github.com/apache/incubator-doris
Apache Doris 开发者邮件组:
dev@doris.apache.org





