- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 视频嵌入链接 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
《Apache Doris 源码解析系列直播 —— 第1讲 建表语句的执行过程》
展开查看详情
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 • 工作线程 • 从队列取出任务 • 执行 • 汇报结果