具体描述
Spark SQL 是 Spark 技术体系中较有影响力的应用(Killer application),也是 SQL-on-Hadoop 解决方案 中举足轻重的产品。《Spark SQL内核剖析》由 11 章构成,从源码层面深入介绍 Spark SQL 内部实现机制,以及在实际业务场 景中的开发实践,其中包括 SQL 编译实现、逻辑计划的生成与优化、物理计划的生成与优化、Aggregation 算子和 Join 算子的实现与执行、Tungsten 优化技术、生产环境中的一些改造优化经验等。
《Spark SQL内核剖析》不属于入门级教程,需要读者对基本概念有一定的了解。在企业中任职的系统架构师和软件开发人员,以及对大数据、分布式计算和数据库系统实现感兴趣的研究人员,均适合阅读《Spark SQL内核剖析》。
作者简介
朱锋,博士毕业于中科院软件所,研究方向为分布式计算与软件工程。长期关注数据分析、数据库技术和大数据相关系统,并积极参与开源社区贡献。2017年加入腾讯,负责Spark SQL相关平台的开发、优化和维护工作,在SQL-on-Hadoop方面积累了丰富的经验。
张韶全,香港中文大学博士,博士期间研究方向为系统最优分布式算法。曾任香港应用研究院研究员、联想香港研发中心高级研究员。现任腾讯大数据平台高级研发工程师,负责腾讯大数据SQL平台的建设与研发,平台规模达到上万台服务器,百万级别业务量,PB级日数据计算量,支撑着腾讯全公司的数据分析业务,拥有多年互联网公司一线的大数据平台设计与研发经验。旨在传播大数据技术和实践经验,使其在不同行业落地生根。
黄明,腾讯T4专家,Spark中国区早期研究者和布道者之一。
目录信息
1.1 大数据与 Spark 系统 1
1.2 关系模型与 SQL 语言 3
1.3 Spark SQL 发展历程 4
1.4 本章小结 5
第 2 章 Spark 基础知识介绍 6
2.1 RDD 编程模型 6
2.2 DataFrame 与 Dataset 9
2.3 本章小结 10
第 3 章 Spark SQL 执行全过程概述 11
3.1 从 SQL 到 RDD:一个简单的案例 11
3.2 重要概念 14
3.2.1 InternalRow 体系 14
3.2.2 TreeNode 体系 15
3.2.3 Expression 体系 17
3.3 内部数据类型系统 20
3.4 本章小结 21
第 4 章 Spark SQL 编译器 Parser 22
4.1 DSL 工具之 ANTLR 简介 22
4.1.1 基于 ANTLR 4 的计算器 23
4.1.2 访问者模式 25
4.2 SparkSqlParser 之 AstBuilder 28
4.3 常见 SQL 生成的抽象语法树概览 30
4.4 本章小结 33
第 5 章 Spark SQL 逻辑计划(LogicalPlan) 34
5.1 Spark SQL 逻辑计划概述 34
5.2 LogicalPlan 简介 35
5.2.1 QueryPlan 概述 35
5.2.2 LogicalPlan 基本操作与分类 37
5.2.3 LeafNode 类型的 LogicalPlan 38
5.2.4 UnaryNode 类型的 LogicalPlan 39
5.2.5 BinaryNode 类型的 LogicalPlan 40
5.2.6 其他类型的 LogicalPlan 41
5.3 AstBuilder 机制:Unresolved LogicalPlan 生成 41
5.4 Analyzer 机制:Analyzed LogicalPlan 生成 46
5.4.1 Catalog 体系分析 46
5.4.2 Rule 体系 48
5.4.3 Analyzed LogicalPlan 生成过程 50
5.5 Spark SQL 优化器 Optimizer 56
5.5.1 Optimizer 概述 56
5.5.2 Optimizer 规则体系 57
5.5.3 Optimized LogicalPlan 的生成过程 62
5.6 本章小结 64
第 6 章 Spark SQL 物理计划(PhysicalPlan) 66
6.1 Spark SQL 物理计划概述 66
6.2 SparkPlan 简介 67
6.2.1 LeafExecNode 类型 68
6.2.2 UnaryExecNode 类型 69
6.2.3 BinaryExecNode 类型 70
6.2.4 其他类型的 SparkPlan 70
6.3 Metadata 与 Metrics 体系 71
6.4 Partitioning 与 Ordering 体系 72
6.4.1 Distribution 与 Partitioning 的概念 72
6.4.2 SparkPlan 的常用分区排序操作 76
6.5 SparkPlan 生成 77
6.5.1 物理计划 Strategy 体系 79
6.5.2 常见 Strategy 分析 81
6.6 执行前的准备 83
6.6.1 PlanSubqueries 规则 84
6.6.2 EnsureRequirements 规则 85
6.7 本章小结 89
第 7 章 Spark SQL 之 Aggregation 实现 90
7.1 Aggregation 执行概述 90
7.1.1 文法定义 90
7.1.2 聚合语句 Unresolved LogicalPlan 生成 92
7.1.3 从逻辑算子树到物理算子树 93
7.2 聚合函数(AggregateFunction) 97
7.2.1 聚合缓冲区与聚合模式(AggregateMode) 97
7.2.2 DeclarativeAggregate 聚合函数 100
7.2.3 ImperativeAggregate 聚合函数 101
7.2.4 TypedImperativeAggregate 聚合函数 101
7.3 聚合执行 102
7.3.1 执行框架 AggregationIterator 103
7.3.2 基于排序的聚合算子 SortAggregateExec 104
7.3.3 基于 Hash 的聚合算子 HashAggregateExec 105
7.4 窗口(Window)函数 108
7.4.1 窗口函数定义与简介 109
7.4.2 窗口函数相关表达式 111
7.4.3 窗口函数的逻辑计划阶段与物理计划阶段 113
7.4.4 窗口函数的执行 117
7.5 多维分析 120
7.5.1 OLAP 多维分析背景 120
7.5.2 Spark SQL 多维查询 121
7.5.3 多维分析 LogicalPlan 阶段 123
7.5.4 多维分析 PhysicalPlan 与执行 126
7.6 本章小结 128
第 8 章 Spark SQL 之 Join 实现 129
8.1 Join 查询概述 129
8.2 文法定义与抽象语法树 130
8.3 Join 查询逻辑计划 133
8.3.1 从 AST 到 Unresolved LogicalPlan 133
8.3.2 从 Unresolve LogicalPlan 到 Analyzed LogicalPlan 136
8.3.3 从 Analyzed LogicalPlan 到 Optimized LogicalPlan 137
8.4 Join 查询物理计划 140
8.4.1 Join 物理计划的生成 140
8.4.2 Join 物理计划的选取 141
8.5 Join 查询执行 143
8.5.1 Join 执行基本框架 143
8.5.2 BroadcastJoinExec 执行机制 144
8.5.3 ShuffledHashJoinExec 执行机制 145
8.5.4 SortMergeJoinExec 执行机制 148
8.6 本章小结 155
第 9 章 Tungsten 技术实现 156
9.1 内存管理与二进制处理 156
9.1.1 Spark 内存管理基础 156
9.1.2 Tungsten 内存管理优化基础 174
9.1.3 Tungsten 内存优化应用 179
9.2 缓存敏感计算(Cache-aware computation) 185
9.3 动态代码生成(Code generation) 188
9.3.1 漫谈代码生成 188
9.3.2 Janino 编译器实践 190
9.3.3 基本(表达式)代码生成 191
9.3.4 全阶段代码生成(WholeStageCodegen) 196
9.4 本章小结 211
第 10 章 Spark SQL 连接 Hive 212
10.1 Spark SQL 连接 Hive 概述 212
10.2 Hive 相关的规则和策略 213
10.2.1 HiveSessionCatalog 体系 213
10.2.2 Analyzer 之 Hive-Specific 分析规则 216
10.2.3 SparkPlanner 之 Hive-Specific 转换策略 217
10.2.4 Hive 相关的任务执行 218
10.3 Spark SQL 与 Hive 数据类型 219
10.3.1 Hive 数据类型与 SerDe 框架 219
10.3.2 DataTypeToInspector 与 Data Wrapping 220
10.3.3 InspectorToDataType 与 Data Unwrapping 221
10.4 Hive UDF 管理机制 223
10.5 Spark Thrift Server 实现 225
10.5.1 Service 体系 227
10.5.2 Operation 与 OperationManager 228
10.5.3 Session 与 SessionManager 232
10.5.4 Authentication 安全认证管理 234
10.5.5 Spark Thrift Server 执行流程 235
10.6 本章小结 239
第 11 章 Spark SQL 开发与实践 240
11.1 腾讯大数据平台(TDW)简介 240
11.2 腾讯大数据平台 SQL 引擎(TDW-SQL-Engine) 241
11.2.1 SQL-Engine 背景与演化历程 241
11.2.2 SQL-Engine 整体架构 242
11.3 TDW-Spark SQL 开发与优化 244
11.3.1 业务运行支撑框架 244
11.3.2 新功能开发案例 248
11.3.3 性能优化开发案例 256
11.4 业务实践经验与教训 261
11.4.1 Spark SQL 集群管理的经验 261
11.4.2 Spark SQL 业务层面调优 263
11.4.3 SQL 写法的“陷阱” 268
11.5 本章小结 271
总结 272
参考文献 273
· · · · · · (收起)
读后感
用户评价
这本书的叙事节奏把握得非常精准,它先宏观地建立了Spark SQL的生态图景,然后逐步深入到微观的内存管理和代码生成部分。我尤其欣赏作者在介绍Tungsten架构时所展现出的那种对内存效率的偏执。在处理大数据时,I/O和内存访问往往是性能瓶颈,而Tungsten通过紧凑的内存布局和优化的编码/解码机制,极大地减少了垃圾回收的压力。作者用大量的篇幅对比了JVM对象和列存格式之间的性能鸿沟,这种对比不是空洞的说教,而是用实际的Benchmark数据支撑起来的论据。这让我反思了过去几年工作中,对于数据结构设计上的诸多“想当然”。它不仅教会了我“怎么做”,更重要的是,让我理解了“为什么必须这么做”——因为在TB甚至PB级别的数据量下,每一个字节的优化都意味着数小时的计算时间节省。
总而言之,这是一本“干货满满、拒绝注水”的硬核技术著作。它没有采用那些吸引眼球的夸大宣传口号,而是用严谨的逻辑和深入的代码分析,为每一个关心Spark SQL性能和原理的工程师提供了一份详尽的蓝图。如果你仅仅满足于写出能跑起来的查询语句,市面上很多入门级书籍足以满足你。但如果你渴望成为能够深入到引擎核心、能够对复杂查询进行前瞻性优化的“专家级”用户,那么这本书提供的信息密度和洞察力是无与伦比的。它更像是一份“内参”,里面记载的都是那些需要花费数月乃至数年时间在生产环境中摸爬滚打才能获得的宝贵经验结晶。对于希望将Spark SQL技术栈推向极限的用户,这本书是不可或缺的指路明灯。
读完前三章,我不得不承认,作者的功力深厚得超乎想象。他没有像很多市面上的教材那样,只是罗列API和代码示例,而是真正从源码的角度去剖析Spark SQL的架构演进和设计哲学。特别是关于逻辑计划到物理计划的转换过程,作者引入了大量的类图和流程图,将原本抽象的DAG(有向无环图)具象化了。我记得有一处描述了谓词下推(Predicate Pushdown)的优化策略,作者通过对比两种不同查询路径的字节码差异,直观地展示了优化器是如何剪枝的。这种将理论与实际源码执行效率挂钩的讲解方式,对于我们这些需要进行性能调优的人来说,简直是醍醐灌顶。它不再是教科书上的概念堆砌,而是实实在在的工程经验总结。我甚至能想象到作者在敲下这些文字时,面前堆满了大量的调试日志和OpenJDK的源码文件,那种对细节的执着和钻研精神,是作者最好的“广告”。
这本书拿到手上的时候,我立刻被它硬朗的封面设计吸引住了,那种深邃的蓝色调和充满科技感的字体,让人感觉这不是一本简单的技术手册,而是一部深入底层、揭示奥秘的“武功秘籍”。我本来就是一名在数据处理领域摸爬滚打了好几年的工程师,一直对Spark的底层机制充满好奇,尤其是SQL的执行过程,那黑箱操作常常让人感到困惑和无力。这本书的初衷显然是填补这个空白,它承诺带你走过SQL查询从提交到最终结果输出的每一步,那种“庖丁解牛”式的分解,让人对接下来的学习充满期待。在快速翻阅目录时,我注意到它对Catalyst优化器和Tungsten执行引擎的篇幅占比非常大,这正是业内公认的最核心、也最难理解的部分。我非常期待它能用一种清晰、逻辑严密的方式,将这些复杂的概念拆解开来,让我这个偏向应用层的开发者也能窥见其内部运作的精妙之处,真正理解为何某些SQL语句能飞速执行,而另一些却慢如蜗牛。
不过,这本书的深度对于初学者来说,可能是一把双刃剑。它毫不留情地撕开了Spark SQL的光鲜外表,让你直面那些错综复杂的内部逻辑。在我阅读到关于“Adaptive Query Execution”(自适应查询执行)的章节时,我感觉自己仿佛置身于一个巨大的齿轮箱内部,需要极高的专注力才能跟上作者的思路。很多地方,比如对UnsafeRow、Vectorized UDF的实现细节,如果没有一定的Java/Scala编程背景或者对JVM特性有基础了解,可能会读得比较吃力。这不是一本可以“翻阅”的书,它要求读者投入大量的时间去理解其背后的设计取舍。每一次我试图跳过某个技术细节时,都会发现后续的内容无法连贯,最终还是得退回来,逐字逐句地去啃下那块“硬骨头”。这无疑增加了阅读的难度,但也正因如此,一旦理解,收获将会是质的飞跃。
挺hard core的书,还是需要带着需求去看,如果实习的时候能看看这本书,做Spark SQL物化视图应该会很有很多新的启发。
可以当2.0版本的工具书。一些细节说的都非常详细,难得的国人佳作。
内容不错,讲得很细。语言组织的也不错。值得推荐。
之前完全没用过spark假期入门下,相比calcite catalyst更容易看些,tungsten那章很有意思,不错的书推荐推荐...ps 貌似书里shuffle拼写错了😅
三星半吧,入门是够了,内容讲解还算清楚