编辑推荐

适读人群:系统架构师和软件开发人员,以及对大数据、分布式计算和数据库系统实现感兴趣的研究人员

√揭秘SparkSQL内部架构、算法设计与实现原理,从源码实现层面掌握数据库SQL处理与Spark分布式计算模型。

√作为SQL-on-Hadoop解决方案的佼佼者,SparkSQL志在取代传统数据仓库,在数据库应用场景中其模块一直备受关注。

√腾讯T4专家|Spark领军人物黄明领衔,长期从事分布式计算和查询优化方面工作,对SparkSQL有较深入研究及大量工程积累。

√分享腾讯日均百万SQL总量和数百PB数据处理的一线生产实践,其中披露TDW经验对大数据平台建设和性能优化有重要借鉴意义。

√适合要对原生系统进行定制化改造或新特性添加的开发人员,以及想通过理解系统背后核心知识学习分布式系统和数据库实现等技术的从业者。

内容简介

SparkSQL是Spark技术体系中较有影响力的应用(Killerapplication),也是SQL-on-Hadoop解决方案中举足轻重的产品。《SparkSQL内核剖析》由11章构成,从源码层面深入介绍SparkSQL内部实现机制,以及在实际业务场景中的开发实践,其中包括SQL编译实现、逻辑计划的生成与优化、物理计划的生成与优化、Aggregation算子和Join算子的实现与执行、Tungsten优化技术、生产环境中的一些改造优化经验等。

《SparkSQL内核剖析》不属于入门级教程,需要读者对基本概念有一定的了解。在企业中任职的系统架构师和软件开发人员,以及对大数据、分布式计算和数据库系统实现感兴趣的研究人员,均适合阅读《SparkSQL内核剖析》。

作者简介

朱锋,博士毕业于中科院软件所,研究方向为分布式计算与软件工程。长期关注数据分析、数据库技术和大数据相关系统,并积极参与开源社区贡献。2017年加入腾讯,负责SparkSQL相关平台的开发、优化和维护工作,在SQL-on-Hadoop方面积累了丰富的经验。

张韶全,香港中文大学博士,博士期间研究方向为系统优分布式算法。曾任香港应用研究院研究员、联想香港研发中心高级研究员。现任腾讯大数据平台高级研发工程师,负责腾讯大数据SQL平台的建设与研发,平台规模达到上万台服务器,百万级别业务量,PB级日数据计算量,支撑着腾讯全公司的数据分析业务,拥有多年互联网公司一线的大数据平台设计与研发经验。旨在传播大数据技术和实践经验,使其在不同行业落地生根。

黄明,腾讯T4专家,Spark中国区早期研究者和布道者之一。

精彩书评

SparkSQL大大降低了数据分析人员使用Spark系统进行大数据处理的门槛。然而,相比网络社区的快速发展,相关的参考资料目前仍然比较匮乏,特别缺少对内部原理的深入解读。《Spark SQL内核剖析》从源码层面给出了SparkSQL从解析、优化到执行的全部图景,是难得的进阶图书。

周亮百度高级工程师

Spark SQL内核剖析》作者长期从事分布式计算和查询优化方面的工作,对SparkSQL有较深入的研究及大量的工程积累。书中内容注重主线,从大量代码中提炼出纲要并按照模块展开,有点有面。读者在阅读过程中既能够从宏观上了然于胸,也能在特定的技术点深入其中。此外,作者分享的TDW实践经验对大数据平台建设和性能优化有着很重要的借鉴意义。

罗涛小米人工智能与云平台研发工程师

SparkSQL是Spark生态圈中较活跃的部分,是近年来SQL-on-Hadoop解决方案中的佼佼者。《Spark SQL内核剖析》深入地分析了SparkSQL的内部实现原理,更难能可贵的是,《Spark SQL内核剖析》作者还分享了在大规模生产环境中的实践经验,干货非常多。我相信,无论是新手还是老手,都能够从中获益。

张呈刚(www.linkedin.com/in/chenggangschool)AWS资深解决方案架构师

Spark SQL内核剖析》适合掌握了一些基础知识的读者,如果你不满足于只知道SparkSQL是什么,而是想了解更多的实现原理,以及SQL这种声明式语言如何变为最终的RDD计算模型,那么《Spark SQL内核剖析》将为你系统地答疑解惑。读者可以通过《Spark SQL内核剖析》学习分布式系统和数据库实现等技术,理解系统背后的核心知识。

赵鑫声智科技高级工程师

这是一本Spark高阶玩家的晋级宝典。作者深入浅出地剖析了SparkSQL的内部架构、算法设计与实现原理,让读者从知其然到知其所以然,从了解Spark、用好Spark到真正精通改造Spark。

朱雷(www.linkedin.com/in/lei-zhu-a4a63756)iGola骑鹅旅行首席架构师

目前,同类书籍一般从Spark本身入手顺带涉及SQL模块的内容,但是在数据库的应用场景中,SQL模块往往是用户和开发人员较关注的部分。《Spark SQL内核剖析》正是以此为目标的进阶型图书,对于想对原生系统进行定制化改造的研发人员来说,这是一本实用的好书。

田斐Oracle工程师

Spark SQL内核剖析》结合前沿科研成果和一线工程实践,深入探讨了SparkSQL内部的原理,并分享了腾讯日均百万SQL总量和数百PB数据处理能力的平台建设经验。内容清晰而简明,讲解透彻而不枯燥,许多章节内容可提升读者触类旁通的能力。书中的背景概述等介绍有着学术论文的严谨,细节部分则适合结合源码参照理解。

纪树平德国慕尼黑工业大学博士,AMZN软件工程师

目录

第1章SparkSQL背景
1.1大数据与Spark系统
1.2关系模型与SQL语言
1.3SparkSQL发展历程
1.4本章小结
第2章Spark基础知识介绍
2.1RDD编程模型
2.2DataFrame与Dataset
2.3本章小结
第3章SparkSQL执行全过程概述
3.1从SQL到RDD:一个简单的案例
3.2重要概念
3.2.1InternalRow体系
3.2.2TreeNode体系
3.2.3Expression体系
3.3内部数据类型系统
3.4本章小结
第4章SparkSQL编译器Parser
4.1DSL工具之ANTLR简介
4.1.1基于ANTLR4的计算器
4.1.2访问者模式
4.2SparkSqlParser之AstBuilder
4.3常见SQL生成的抽象语法树概览
4.4本章小结
第5章SparkSQL逻辑计划(LogicalPlan)
5.1SparkSQL逻辑计划概述
5.2LogicalPlan简介
5.2.1QueryPlan概述
5.2.2LogicalPlan基本操作与分类
5.2.3LeafNode类型的LogicalPlan
5.2.4UnaryNode类型的LogicalPlan
5.2.5BinaryNode类型的LogicalPlan
5.2.6其他类型的LogicalPlan
5.3AstBuilder机制:UnresolvedLogicalPlan生成
5.4Analyzer机制:AnalyzedLogicalPlan生成
5.4.1Catalog体系分析
5.4.2Rule体系
5.4.3AnalyzedLogicalPlan生成过程
5.5SparkSQL优化器Optimizer
5.5.1Optimizer概述
5.5.2Optimizer规则体系
5.5.3OptimizedLogicalPlan的生成过程
5.6本章小结
第6章SparkSQL物理计划(PhysicalPlan)
6.1SparkSQL物理计划概述
6.2SparkPlan简介
6.2.1LeafExecNode类型
6.2.2UnaryExecNode类型
6.2.3BinaryExecNode类型
6.2.4其他类型的SparkPlan
6.3Metadata与Metrics体系
6.4Partitioning与Ordering体系
6.4.1Distribution与Partitioning的概念
6.4.2SparkPlan的常用分区排序操作
6.5SparkPlan生成
6.5.1物理计划Strategy体系
6.5.2常见Strategy分析
6.6执行前的准备
6.6.1PlanSubqueries规则
6.6.2EnsureRequirements规则
6.7本章小结
第7章SparkSQL之Aggregation实现
7.1Aggregation执行概述
7.1.1文法定义
7.1.2聚合语句UnresolvedLogicalPlan生成
7.1.3从逻辑算子树到物理算子树
7.2聚合函数(AggregateFunction)
7.2.1聚合缓冲区与聚合模式(AggregateMode)
7.2.2DeclarativeAggregate聚合函数
7.2.3ImperativeAggregate聚合函数
7.2.4TypedImperativeAggregate聚合函数
7.3聚合执行
7.3.1执行框架AggregationIterator
7.3.2基于排序的聚合算子SortAggregateExec
7.3.3基于Hash的聚合算子HashAggregateExec
7.4窗口(Window)函数
7.4.1窗口函数定义与简介
7.4.2窗口函数相关表达式
7.4.3窗口函数的逻辑计划阶段与物理计划阶段
7.4.4窗口函数的执行
7.5多维分析
7.5.1OLAP多维分析背景
7.5.2SparkSQL多维查询
7.5.3多维分析LogicalPlan阶段
7.5.4多维分析PhysicalPlan与执行
7.6本章小结
第8章SparkSQL之Join实现
8.1Join查询概述
8.2文法定义与抽象语法树
8.3Join查询逻辑计划
8.3.1从AST到UnresolvedLogicalPlan
8.3.2从UnresolveLogicalPlan到AnalyzedLogicalPlan
8.3.3从AnalyzedLogicalPlan到OptimizedLogicalPlan
8.4Join查询物理计划
8.4.1Join物理计划的生成
8.4.2Join物理计划的选取
8.5Join查询执行
8.5.1Join执行基本框架
8.5.2BroadcastJoinExec执行机制
8.5.3ShuffledHashJoinExec执行机制
8.5.4SortMergeJoinExec执行机制
8.6本章小结
第9章Tungsten技术实现
9.1内存管理与二进制处理
9.1.1Spark内存管理基础
9.1.2Tungsten内存管理优化基础
9.1.3Tungsten内存优化应用
9.2缓存敏感计算(Cache-awarecomputation)
9.3动态代码生成(Codegeneration)
9.3.1漫谈代码生成
9.3.2Janino编译器实践
9.3.3基本(表达式)代码生成
9.3.4全阶段代码生成(WholeStageCodegen)
9.4本章小结
第10章SparkSQL连接Hive
10.1SparkSQL连接Hive概述
10.2Hive相关的规则和策略
10.2.1HiveSessionCatalog体系
10.2.2Analyzer之Hive-Specific分析规则
10.2.3SparkPlanner之Hive-Specific转换策略
10.2.4Hive相关的任务执行
10.3SparkSQL与Hive数据类型
10.3.1Hive数据类型与SerDe框架
10.3.2DataTypeToInspector与DataWrapping
10.3.3InspectorToDataType与DataUnwrapping
10.4HiveUDF管理机制
10.5SparkThriftServer实现
10.5.1Service体系
10.5.2Operation与OperationManager
10.5.3Session与SessionManager
10.5.4Authentication安全认证管理
10.5.5SparkThriftServer执行流程
10.6本章小结
第11章SparkSQL开发与实践
11.1腾讯大数据平台(TDW)简介
11.2腾讯大数据平台SQL引擎(TDW-SQL-Engine)
11.2.1SQL-Engine背景与演化历程
11.2.2SQL-Engine整体架构
11.3TDW-SparkSQL开发与优化
11.3.1业务运行支撑框架
11.3.2新功能开发案例
11.3.3性能优化开发案例
11.4业务实践经验与教训
11.4.1SparkSQL集群管理的经验
11.4.2SparkSQL业务层面调优
11.4.3SQL写法的“陷阱”
11.5本章小结
总结
参考文献

精彩书摘

推荐序1

互联网技术经过几十年的发展已经渗透到人们生活的方方面面,从云计算、大数据到如今如火如荼的人工智能和区块链,相信无论是圈内人还是圈外人,对这些名词都耳熟能详了。仔细一算,“大数据”这个概念的出现已经有十多年了,背后催生的技术可以说是百花齐放、百家争鸣。

2009年年初,腾讯从传统的数据仓库转向基于Hadoop架构的大数据平台,至今将近10年,历经了3代跨越式的发展:2009—2011年是以Hadoop为基础的离线计算时代,2012—2014年是以Spark和Storm为引擎的实时计算时代,2015年至今是以腾讯自研的高性能机器学习平台Angel为核心的智能学习时代。从最简单的统计报表的计算,到万亿特征维度的算法训练,从结构化数据到图片、语音、文本等非结构化数据,腾讯一直用前沿技术来挖掘大数据背后的价值。

如今,腾讯大数据集群规模达到几万台服务器,存储数据量有几百PB,每天有几十PB的计算量,支撑着腾讯包括微信、QQ、游戏、广告、支付、视频、音乐等关键业务,助力腾讯业务发展,服务着十亿级别的用户。正是历经了腾讯数以亿计的海量数据的锤炼,让腾讯大数据平台得到快速的发展,其技术在业内处于领先水平。

腾讯大数据起源于网络社区,并一直积极参与网络社区的建设。2014年,腾讯大数据平台(TDW)的核心组件进行开源,我们在Hadoop、Spark、Docker、Ceph、HBase、Kubernetes、Kafka、Storm、Flink、PostgreSQL等众多社区项目上积极“反哺”社区。2017年6月,我们在GitHub上把腾讯大数据第三代的高性能分布式机器学习平台Angel进行了开源,吸引了海内外众多知名企业用户,并于2018年3月贡献给Linux深度学习基金会(LFDeepLearning)。

除代码层面的开源外,近年来,腾讯也把大数据能力开放给传统企业,我们服务了政务民生、金融、交通、零售、教育、工业等各行各业的用户,旨在让没有大数据人才的企业也能具备使用大数据的能力。我们乐于把腾讯积累了十年的大数据技术和运维经验对外分享、对外输出,《Spark SQL内核剖析》也可以看作是腾讯大数据技术开放的一部分。

Spark SQL内核剖析》的内容最初是腾讯内部为进行SparkSQL开发而整理的技术文档,最后剥离出通用的部分集结成册。从数据的维度来看,无论是单机还是分布式环境,SQL对用户来说都是非常重要的。SparkSQL作为腾讯大数据平台中最基础的部分,支撑全公司的数据分析业务。因此,书中的内容并非是针对SparkSQL技术的空谈,而是立足于腾讯大数据平台的大量实践经验。《Spark SQL内核剖析》的几位作者正是工作在腾讯大数据一线的工程师和技术专家,在日均百万级别的SQL业务处理和优化中积累了丰富的经验。综观《Spark SQL内核剖析》,条理非常清晰,读者既能在高度上知晓来龙去脉和他山之石,又能在深度上体会源码级别的技术点剖析。同时,书中结合实践展示了一些通用案例,避免读者陷入到代码的汪洋大海中。

于我个人而言,大学毕业后在传统的银行工作。后来,在数据爆发的时代,我有幸在国内数据最多的两家公司工作,我在阿里巴巴负责支付宝BI数据平台基础架构和应用架构,来到腾讯后一直负责腾讯的大数据业务。十多年的职业生涯,转换了公司,也转换了工作和生活的城市,但一直不变的是我的工作始终围绕着“数据”展开,无论是在传统IT行业,还是在互联网行业,“数据”始终是我工作的核心内容,而我自己最大的职业追求也离不开“数据”。

未来,在人们的生活中,数据将无时无刻无处不在,数据与商业的真正结合将爆发出强大的生命力和价值。作为服务于上层业务的基础支撑平台,最重要的地方在于技术的沉淀和积累,不断打磨优化。从技术研发人员的角度来讲,最重要的是修炼好自己的“内功”,不忘初心。最后,希望每一位读者都能够从《Spark SQL内核剖析》中有所收获,练好数据的“内功”,与数据结缘。

蒋杰博士腾讯首席数据官、腾讯数据平台部总经理

CCF大数据专家委员会委员

2018年7月

推荐序2

非常高兴收到了师弟朱锋、张博士和明哥关于SparkSQL的书稿,也非常荣幸被邀请为《Spark SQL内核剖析》作友情序言。本人是朱锋在中科院软件所读博时的师兄,2014年也曾经在明哥组内实习,目前在中科院从事大数据方面的科研工作,主要关注Spark/Flink等大数据处理系统及大数据分析算法,之前也在GitHub上写过SparkInternals等介绍技术原理的文章。

去年就听闻师弟他们在写一本关于SparkSQL的书,希望能够将生产环境中平台开发建设的一些经验总结出来。当时感觉有些惊讶,惊讶师弟从学术界到工业界能够快速转变,短时间内深入理解了整个系统,并能将经验总结成书。后来想了一下,这也是在情理之中的。朱锋的博士论文的内容就和SQL-on-Hadoop解决方案相关,在Hadoop、Hive、HBase等系统上也积累了多年的开发应用经验,在腾讯接触工业界实际案例后能够迅速应用所学知识,加上读博期间训练出来的抽象表达能力,与张博士一起,在明哥的全力支持下,足以写出一本有深度的技术图书。

虽然是熟人,但刚收到书时,我也有着顾虑。相信大多数读者也是如此,就是想知道这《Spark SQL内核剖析》是否值得读,讲没讲干货,能否让读者快速理解SparkSQL的原理,能否对读者的实际工作有用。带着这些问题,我开始了阅读,发现越读干货越多,从SparkSQL历史到SparkSQL语法解析,从逻辑执行计划和物理执行计划生成,继续往下切入到Tungsten内存管理,全面讲述了SparkSQL技术的方方面面,不仅有原理介绍,还有实现细节的描述和总结,更有在海量数据和海量业务下的实践经验的总结。这些对想深入理解SparkSQL,并对其进行优化改进,以及想更高效地使用SparkSQL的开发者、用户都有莫大的帮助。

抱着学习的态度读完《Spark SQL内核剖析》,我在以下几个方面受益匪浅:逻辑执行计划、物理执行计划、优化方法等背后的技术原理,《Spark SQL内核剖析》均透彻地讲清楚了。在读的过程中,我也在感概,记得前几年带组里的师弟师妹们想在SparkSQL中添加关键词查询功能(类似MySQL中的MATCH关键词),发现需要在SparkSQL中添加新语法、改进语法解析、对翻译生成执行计划等一系列模块进行改进,由于当时缺少SparkSQL技术体系引导和深入解析的书籍,因此我们花了不少时间扎入代码,并自行总结技术体系和实现原理。《Spark SQL内核剖析》的内容对于想对SparkSQL进行二次开发的读者非常有用,可以让二次开发事半功倍。

因为平时工作需要写论文,同时也会写技术报告和文档,所以深知写一本简洁易懂又包含复杂技术知识的图书有多困难,不仅需要花费大量精力阅读代码、分析细节,还需要在高层进行抽象总结、简洁表达。在阅读《Spark SQL内核剖析》的过程中,可以从字里行间感受到作者们的用心和付出的努力。例如,作者在讲解ANTLR4时,首先自己设计一个简单的例子,并进行相应的代码实现,在生成逻辑算子树时用到的访问者模式也会以实例进行说明。在技术展现方面,要画出图3.8、图7.10等,不仅需要仔细阅读代码中的每个类的实现,而且需要考虑图形布局以达到直观的效果。

Spark是一个易用性、通用性都很高的框架,除SparkSQL外,上层还有面向图计算的GraphX框架、机器学习MLlib库,流处理的SparkStreaming库,希望包括几位作者在内的业界专家能够为读者带来更多高水平的解析和总结。SparkSQL本身也在演变中,希望《Spark SQL内核剖析》有第二版、第三版等,能够不断加入更多的技术解析,不断完善。作为一名研究者,我自己也会努力去设计实现更多能够解决大数据实际问题的系统和方法,共勉之。

许利杰(@JerryLead)http://www.tcse.cn/?xulijie/

中科院软件所

2018年6月15日

前言/序言

极其迅速的信息传播将人们带入了大数据时代,也推动了大数据技术的发展。Spark于2009年诞生于伯克利大学AMP实验室,至今已经形成完整的生态圈。除参与度高的开源社区外,各种相关的技术分享和论坛(如每年的SparkSummit)也是如火如荼。得益于其灵活的RDD计算模型,Spark系统高效地支持了各类应用,涉及SQL处理、图计算和机器学习等。

Spark SQL内核剖析》重点讲解SparkSQL,该系统在企业中的应用非常广泛,也是Spark生态圈中较活跃的部分。从另一个视角来看,SparkSQL是近年来SQL-on-Hadoop解决方案(包括Hive、Presto和Impala等)中的佼佼者,结合了数据库SQL处理和Spark分布式计算模型两个方面的技术,目标是取代传统的数据仓库。

在实际生产环境中,因为一些个性化的需求,往往涉及对原生的SparkSQL系统进行定制化的改造或新特性的添加,此过程需要开发人员对内部实现有深入的了解。然而笔者发现,目前业界在这方面的资料还比较缺乏,虽然已经涌现了一系列的文章和书籍,但内容通常都以Spark本身为主,或者停留在API使用和概括性介绍层面,难以满足开发人员的需求。

Spark SQL内核剖析》定位于弥补这方面的空白,对Spark的基本概念和功能(如RDD和调度等)不再展开讲解,而是将内容重点放在SQL内核实现的剖析上,旨在同读者一起“入于其中”,从源码实现上学习分布式计算和数据库领域的相关技术。

Spark SQL内核剖析》面向的读者

Spark SQL内核剖析》主要面向在企业中任职的系统架构师和软件开发人员,以及对大数据、分布式计算和数据库系统实现感兴趣的研究人员。需要注意的是,《Spark SQL内核剖析》对读者在大数据系统和数据库方面的基础知识(SQL)上有一定的要求。对于初学者来说,最好能够首先参考相关资料,做到有所了解。

Spark SQL内核剖析》的主要内容

Spark SQL内核剖析》的内容可以分成4个部分:(1)背景和基础知识概述(第1~2章),这两章分别介绍SparkSQL的前生今世和与Spark相关的基础知识,对此熟悉的读者可以直接跳过;(2)SparkSQL功能实现的各个阶段(第3~6章),这4章结合简单例子分别从整体和每个阶段的细节介绍内部机制,涉及SQL编译、逻辑计划和物理计划;(3)专题展开(第7~10章),这4章重点介绍SparkSQL中Aggregation和Join实现,深入分析Tungsten计划中的几项优化技术,以及SparkSQL连接Hive的实现;(4)实践部分(第11章),这一章分享SparkSQL系统在生产环境中的应用和一些改造优化经验。

一些约定和说明

√相关术语:Spark依赖于JVM,主体采用Scala开发语言,部分功能也用到了Java语言来实现。《Spark SQL内核剖析》没有严格地区分两种语言的术语,例如Scala语言中的trait(特质)和Java语言中的interface(接口)等,书中一般以Java语言的术语为主。此外,《Spark SQL内核剖析》涉及的源码分析较多,不方便直接翻译的类或接口命名,以其英文命名为主。一些SQL关键词(例如Select、Join等)或Spark术语(例如Shuffle、Partition、Executor等)在不同上下文环境中也会出现大小写混用的情况。另外,Map和Reduce虽然是来自MapReduce中的概念,但《Spark SQL内核剖析》在介绍SparkSQL时也使用了这两个概念,分别用来表示Shuffle前的阶段和Shuffle后的阶段。

√版本说明:《Spark SQL内核剖析》使用的Spark版本是Spark2.X。笔者在写作时,以2.1版本和2.2版本中的实现机制为主。然而,Spark社区活跃,版本的演化非常迅速(平均半年一个版本),读者在理解基本的框架和思路后可以结合JIRA上的相关Issue和对应的Patch进行跟踪。当然,后期最好的方式是参与到社区的贡献中。

√推荐的阅读方式:《Spark SQL内核剖析》内容涉及的实现细节较多,因此建议的阅读方式是结合代码进行理解。调试环境搭建好之后,在关键步骤插入日志信息,纵向(宏观)和横向(细节)分析交叉进行,最终做到在脑海中将上层的SQL语句映射为底层的RDD模型。

前沿技术的整理和分析并不是一件轻松的工作,从大纲的确定、内容的选择到最终出版得益于多方的大力支持。在此感谢电子工业出版社的各位编辑对《Spark SQL内核剖析》出版提供的帮助,感谢马朋勃、马骉和邓飞等提出的宝贵修改建议。写作是一个不断学习并进行归纳和整理的过程,笔者在写作中也受到相关技术博客和论文思路的启发,在此一并感谢。

因笔者水平有限,《Spark SQL内核剖析》的错漏和不足之处欢迎广大读者朋友批评指证。如果有更好的建议,也欢迎通过电子邮件联系几位作者:朱锋(wellfengzhu@gmail.com)、张韶全(shaoquan.zhang@hotmail.com)和黄明(andyyehoo@gmail.com)。


其他推荐