SparkSql源码成神之路

2022-11-24 16:16:07 浏览数 (1)

快来加入我的源码学习社群吧,在社群的长期陪伴下,解决你在学习路上遇到的点点滴滴的问题~~

底层原理搞清楚,专业技术能力的提升直接开挂!!!

俺的招牌照片

这篇主要介绍一下,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、总结:读源码的方法、运行阶段的调试技巧

这篇文章后面还可能会重写很多遍,因为内容在不断迭代呀


精读源码,是一种有效的修炼技术内功的方式~~

0 人点赞