申请试用
HOT
登录
注册
 
《Apache Doris 源码解析系列直播 —— 第1讲 建表语句的执行过程》
8 点赞
2 收藏
97下载
Apache Doris
/
发布于
/
933
人观看
展开查看详情

1.Apache Doris 源码阅读与解析 第一讲:建表语句的执行过程 陈明雨

2.课程介绍 • 涵盖Doris主要模块和流程 • 查询、导入、元数据、分布式管理等 • 面向开发者的入门课程 • 基本原理介绍、代码位置、主要接口等

3.课程大纲 • 用户请求的入口函数 • 一个DDL语句是如何被解析的 • Doris 元数据的修改与持久化 • 建表任务的创建一节FE与Be之间的任务交互过程

4. 第0讲回顾 • https://mp.weixin.qq.com/s/vaTovdEYeOwe1_AH3SX3cQ • FE(Java) • 接收用户连接请求(MySQL 协议层) • 元数据存储与管理 • 查询语句的解析与查询计划的执行 • 集群管控 • BE(C++) • 数据存储与管理 • 查询计划的执行

5. 第0讲回顾 • 代码目录 • FE • BE

6.第1讲-课程收获 • 了解建表语句的执行过程 • 了解元数据的修改和持久化过程 • 能够尝试在Doris中实现一个新的语法

7. User 第1讲-流程概览 • 与MySQL协议层交互 FE • 词法解析 MySQL Server • 语法解析 Parser • 修改元数据 Analyzer • 元数据持久化 Catalog • 执行成功 Meta Persist Layer

8.从Main函数说起 • PaloFe.java • 启动各类服务 • FeServer • Http Server • QeService

9.QeService.java • 启动MySQL服务 • NMysqlServer • org.apache.doris.mysql • MySQL 交互协议:https://dev.mysql.com/doc/internals/en/client-server-protocol.html

10.QeService.java • 启动MySQL服务 • NMysqlServer • org.apache.doris.mysql • MySQL 交互协议:https://dev.mysql.com/doc/internals/en/client-server-protocol.html

11. ReadListener handelEvent() 代码调用关系 ConnectProcessor processOnce() dispatch() handleQuery() StmtExecutor execute() handleDdlStmt() DdlExecutor execute() Catalog Backend createTable() EditLog logCreateTable()

12.ReadListener-handleEvent()

13.ConnectProcessor-processOnce() & dispatch() • 命令类型识别

14.ConnectProcessor-handleQuery() • 从连接中读取原始语句字符串 • 词法解析文件 • fe/fe-core/src/main/jflex/sql_scanner.flex • 语法解析文件 • fe/fe-core/src/main/cup/sql_parser.cup

15.ConnectProcessor-analyze() • 从连接中读取原始语句字符串 • 词法解析文件 • fe/fe-core/src/main/jflex/sql_scanner.flex • 语法解析文件 • fe/fe-core/src/main/cup/sql_parser.cup

16.ConnectProcessor-analyze() • 所有语法的实现类 • org.apache.doris.analysis • CreateTableStmt.java

17.StmtExecutor • 语义解析 • 转发处理 • 命令执行

18.StmtExecutor-语义解析 • 词法解析:判断单词的正确性 • 语法解析:语法的正确性 • 语义解析:含义的正确性 • 名称是否合法? • 列类型是否合法 • 分区是否合法 • 权限是否正确?

19.StmtExecutor-转发处理 • Master、Follower 和 Observer • 只能Master有元数据的修改能力 • 所有需要修改元数据的操作,需要转发到Master执行 • 转发类型 • FORWARD_NO_SYNC • FORWARD_WITH_SYNC • NO_FORWARD

20.DdlExecutor-execute() • 根据语句类型执行相应的函数 • catalog.createTable()

21.Catalog-createTable() • 支持多种表类型 • 除了Olap,其他都是映射表 • createOlapTable()

22.Catalog-createOlapTable() • 将语法对象转换为元数据对象 • 创建Table对象 • 创建Partition对象和实体 • 添加到元数据并持久化

23.Catalog- createPartitionWithIndices() Table • 分区是表的实体 Partition • Table Materialized Index • Partition Tablet • MaterializedIndex Replica • Tablet • Replica

24.Catalog- createPartitionWithIndices() • 创建Partition对象 • 创建MaterializedIndex对象 • 对每个MaterializedIndex对象: • 创建Tablet • 创建Replica并发下任务到BE • 等待BE执行任务完成

25.Catalog-添加到元数据并持久化 • Datbase.createTableWithLock() • 将Table添加到Database对象 • 写入元数据日志 • isReplay?

26. ReadListener handelEvent() 流程总结 ConnectProcessor processOnce() dispatch() Analyze handleQuery() • 还有两个环节 • 和BE的任务交互? StmtExecutor execute() handleDdlStmt() • isReplay是什么? DdlExecutor execute() Catalog createTable() EditLog logCreateTable() isReplay

27.FE与BE的任务交互 • FE 发送任务 • BE执行 • Be汇报执行结果 • Fe汇总结果

28.FE与BE的任务交互-FE任务发送 • AgentBatchTask • 收集Task并按Be分组 • AgentTaskExecutor • 发送AgentBatchTask • AgentTaskQueue?

29.FE与BE的任务交互-BE任务接收 • src/agent/agent_server.cpp • 接收task • src/agent/task_worker_pool.cpp • 工作线程 • 从队列取出任务 • 执行 • 汇报结果

8 点赞
2 收藏
97下载