暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

源码解析|Apache Doris源码阅读与解析系列第0讲——从零认识Doris代码库

ApacheDoris 2021-09-23
2375

课 程 介 绍

亲爱的各位小伙伴们,大家期待已久的直播课程终于要跟大家见面了!

《 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#

这里我们建议通过 Git hook 的方式在代码提交时自动格式化。可以按照如下步骤操作:
  • 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 系统架构简述


Apache Doris 系统架构

如上图,Doris 主要有两类进程:Frontend(FE) 和 Backend(BE) 。

Frontend

Frontend 以 Java 语言为主。主要有如下功能职责:
  • 接收用户连接请求(MySQL 协议层)
  • 元数据存储与管理
  • 查询语句的解析与查询计划的执行
  • 集群管控

Backend

Backend 以 C++ 语言为主。主要有如下功能职责:
  • 数据存储与管理

  • 查询计划的执行

本系列课程主要围绕这两个模块中的功能进行讲解。

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

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         导入作业相关代码
├── master // FE Master角色相关的操作代码,如元数据Checkpoint,BE任务汇报的处理等。
├── metric // FE 监控指标相关的代码
├── monitor // JVM 监控相关代码
├── mysql // MySQL协议层相关代码
├── PaloFe.java // Main函数入口
├── persist // 元数据持久化相关的代码
├── planner // 查询优化器相关的代码
├── plugin // Frontend端插件管理相关代码
├── qe // 用于处理各类SQL请求相关的代码。如查询请求的处理类、DDL请求的处理类等
├── resource // 资源标签相关的代码
├── rewrite // 查询优化器重写规则相关的代码
├── rpc // Frontend和Backend之间RPC协议相关的代码
├── service // Frontend侧各种服务器端代码
├── system // 集群节点的实例类和集群节点管理相关的代码
├── task // Frontend发往Backend的各类任务相关的代码
└── transaction // 导入事务相关代码
BE

be/

1
2
3
├── CMakeLists.txt  // CMake 编译文件
├── src // 主代码目录
├── test // 单元测试

主代码目录包含:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
├── agent                   // FE 下发的 agent task 相关处理类
├── common // 通用类
├── env // 文件系统操作类
├── exec // 执行算子相关代码
├── exprs // 表达式、函数计算相关代码
├── geo // 地理位置函数相关代码
├── glibc-compatibility // GLIBC 兼容代码
├── gutil // Google gutil 相关代码
├── http // BE 端 http server 相关代码
├── olap // 存储层代码
├── plugin // BE 插件管理相关代码
├── runtime // 查询层运行时相关代码
├── service // BE 对外服务接口相关代码
├── testutil // 单元测试辅助类
├── tools // 辅助工具相关代码
├── udf // 用户自定义函数相关代码
└── util // 一些工具类
gensrc

gensrc/

1
2
3
4
├── Makefile
├── proto // protobuf 定义文件
├── script // 一些辅助脚本,包括函数定义代码生成模板等
└── thrift // thrift 定义文件

extension

extension/

1
2
3
4
├── DataX                   // DataX doriswriter 插件
├── flink-doris-connector // Flink Doris Connector
├── logstash // logstash 导入插件
└── spark-doris-connector // Spark Doris Connector

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 项目有个宏观的认识。



下 期 预 告


下期课程为《第 1 讲——建表语句的执行过程》,将围绕一个 Apache 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 







文章转载自ApacheDoris,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论