快来加入我的源码学习社群吧,在社群的长期陪伴下,解决你在学习路上遇到的点点滴滴的问题~~
底层原理搞清楚,专业技术能力的提升直接开挂!!!
俺的招牌照片
这篇主要介绍一下,sparksql源码精读实训的内容,分三部分——
【硬核】基础内容(内容比较多,在下面单独介绍):
主要用来打基本功,包括源码环境安装、测试类编写、sparksql解析的整个流程中的每一步的精读,精读过程中贯穿scala基础语法、调试技巧、读源码的方法。
【福利】进阶内容(不断迭代):
以大家日常工作中遇到的问题或者面试遇到的问题为依据,从源码层面深挖
- 1、spark datasource v1和v2区别,以及自定义datasource
- 2、join相关:
- join源码分析
- 怎么选择 JOIN 策略
- 从一道面试题来扒一扒join(面试的时候被问到了spark-SQL的广播join,spark-sql join的时候小表小于10M的时候一定会被优化成广播么)
- join操作比较多怎么优化呢?
- 3、shuffle相关(原理解析、相关面试题总结)
- 4、谓词下推原理详解
【福利】日常经验分享:
1、Spark Web UI 和常用参数
2、常用优化手段
3、cpu使用率优化
4、内存使用率优化
【硬核】基础内容
哈哈,虽然叫基础内容,但是很高级,内容围绕 Spark sql解析的整体流程 展开
1、源码环境安装
为啥有人写的安装文档是这个样子,而有人写的又是另外一种样子?我们要找到安装各种组件的真正原因
主要内容:
- 1、安装源码环境的一些思路
- 2、安装IDE ideaIU-2021.3.2、安装jdk jdk-8u201-macosx-x64 .dmg、安装maven apache-maven-3.8.4-bin.tar.gz、Spark 源码导入IDE、IDE安装antlr和scala插件、IDE配制maven、为spark项目配制jdk、配制scala、切branch3.2、编译源码
- 3、理解测试类,运行测试类
- 4、遇到问题总结
2、SparkSql词法语法分析及ASTTree
词法语法分析是spark catalyst解析sql的基础
主要内容:
- 1、spark catalyst是啥?怎么理解?sparksql代码模块整体介绍、代码流程分析
- 2、词法、语法解析的理解
- 3、antlr的一切(工作流程、安装、idea开发、开发实战动手写代码、生成语法分析器解析、ASTTree遍历、代码实践访问者模式和监听器模式)
- 4、Spark sql词法、语法解析代码分析(sql的ASTTree、遍历)
3、生成未解析的Logical Plan
ASTTree-->生成未解析的 logical plan,这个过程也有一小部分的优化在里面,比如count(*)-->count(1)
主要内容:
- 1、LogicalPlan、Expression理解,类关系,核心方法等
- 2、AstBuilder核心方法、流程
- 3、强撸调试,visitRegularQuerySpecification、visitFromClause、AstBuilder.visitTableName详解、withSelectQuerySpecification等等,整个链路手把手调试,让大家熟悉调试的过程和感觉
- 4、总结迭代方法,调试技巧
4、复习&答疑&问题总结&作业
大家平时有问题都在群里问了,但比较散,来一次总结和作业讲解
主要内容:
- 1、问题答疑总结
- 2、前几次作业详解
5、生成resolved logical plan
当一条 sql 语句被 SparkSqlParser 解析为一个 unresolved logicalPlan 后,接下来就会使用 Analyzer 进行 resolve。所谓的 resolve 也就是在未解析的 db、table、function、partition 等对应的 node 上应用一条条 Rule(规则)来替换为新的 node
主要内容:
- 1、生成resolved logical plan代码入口分析
- 2、分析器Analyzer详解、Analyzer周边
- 3、解析规则整理sparksql源码系列 | 生成resolved logical plan的解析规则整理
- 4、规则执行器RuleExecutor运行原理详解&调试(strategy、Batch、batches、execute等)
- 5、sparksql解析过程中对tree的遍历方法详解(后序遍历、前序遍历、为啥?)
- 6、ResolveRelations、ResolveReferences 规则详解&调试
- 7、总结:
- 细节点、关键点搞清楚,一劳永逸,后面再看到类似的模块就直接开挂
- 调试技巧、读源码的方法总结
- 测试代码总结
6、逻辑执行计划优化(Optimized Logical Plan)
Optimizer的工作方式类似Analyzer,它们都继承自RuleExecutor[LogicalPlan],都是执行一系列的Batch操作,优化包括RBO(Rule Based Optimizer)/CBO(Cost Based Optimizer),optimizer 中的优化器是属于RBO,即基于一些经验规则(Rule)对Logical Plan的语法结构进行优化
主要内容:
- 1、逻辑执行计划优化阶段用到了scala的一些特殊语法讲解(动手写案例测试)
- 2、Optimized Logical Plan代码入口分析
- 3、optimizer详解(excludedRules原则、defaultBatches、nonExcludableRules、batch等)
- 4、解析规则整理:标准的优化规则(Optimizer)和特殊的优化规则(SparkOptimizer),sparksql源码系列 | 最全的logical plan优化规则整理(spark2.3)
- 5、优化器EliminateSubqueryAliases(消除子查询别名)、EliminateView(删除View算子)、ColumnPruning(列裁剪)、CollapseProject(合并Project)等优化器详解&调试
- 6、总结:调试技巧(比如:怎么判断两次的plan是否有变化?怎么看执行计划中节点及参数都用的是哪些实体类?等)、读源码的方法、测试代码总结
7、生成Physical Plan
Optimizer接受输入的Analyzed Logical Plan后,会有SparkPlanner来对Optimized Logical Plan进行转换,生成Physical plans
主要内容:
- 1、生成Physical Plan代码入口分析
- 2、物理执行计划分析器SparkPlanner及周边详解
- 3、SparkPlan和LogicalPlan详解
- 4、物理执行计划生成器QueryPlanner详解及调试(ReturnAnswer是啥?planLater是啥?规则执行过程详解等等)
- 5、生成物理执行计划规则SpecialLimits、Aggregation(获取聚合表达式去重、分离、生成无distinct的物理执行计划、局部聚合、Final聚合等)、BasicOperators详解及调试
- 6、总结:细节点(比如:semanticEquals、canonicalized等)、调试技巧(比如:怎么判断哪些规则起作用?调试迭代函数的方法等)
8、复习&作业&count(distinct)
复习总结和作业讲解
主要内容:
- 1、复习、总结、答疑
- 2、前几次作业详解(RemoveNoopOperators、InferFiltersFromConstraints-过滤推断、sparksql count(distinct)原理及做了哪些优化等)
9、生成executedPlan
executedPlan是对已生成的PhysicalPlan做一些处理,主要是插入shuffle、全阶段代码生等操作
主要内容:
- 1、生成executedPlan代码入口分析
- 2、Partitioning体系理解及详解
- 3、Distribution体系理解及详解
- 4、SparkPlan的requiredChildDistribution、outputPartitioning、requiredChildOrdering、outputOrdering理解及详解
- 5、Exchange体系理解及详解
- 6、EnsureRequirements规则详解
- 7、CollapseCodegenStages规则详解(火山迭代模型、WSCG的优势、CodegenSupport等)
- 8、总结:细节点(比如:satisfies、insertWholeStageCodegen等)、调试技巧(比如:怎么看生成的代码、怎么看哪些规则起作用等)
10、toRDD(HashAggregateExec)
生成 rdd 的程序,提交运行,以HashAggregateExec为例,详解物理执行计划如何执行数据
主要内容:
- 1、代码调用流程详解及调试(HashAggregateExec.doExecute()-->ShuffleExchangeExec. doExecute() -->HashAggregateExec.doExecute()-->SerializeFromObjectExec.doExecute()-->ExternalRDDScanExec.doExecute())
- 2、HashAggregateExec周边详解(ObjectHashAggregateExec、SortAggregateExec、MergingSessionsExec)
- 3、AggregateFunction聚合函数详解(聚合函数缓冲区、DeclarativeAggregate,ImperativeAggregate&TypedImperativeAggregate)
- 4、UnsafeRow详解及调试(UnsafeRow周边、内存布局、UnsafeRow的使用)
- 5、AggregationIterator聚合执行框架详解
- 6、HashAggregateExec、TungstenAggregationIterator详解及调试(初始化聚合缓冲区agg buffer[UnsafeRow]、处理输入数据及如何与聚合函数udaf配合执行、输出计算结果)
- 7、总结:读源码的方法、运行阶段的调试技巧
这篇文章后面还可能会重写很多遍,因为内容在不断迭代呀
精读源码,是一种有效的修炼技术内功的方式~~