前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SparkSql源码成神之路

SparkSql源码成神之路

作者头像
数据仓库践行者
发布2022-11-24 16:16:07
8930
发布2022-11-24 16:16:07
举报

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

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

俺的招牌照片

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

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


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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库践行者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档