Spark SQL内核剖析
  • 推荐0
  • 收藏0
  • 浏览742

Spark SQL内核剖析

朱锋 张韶全 黄明 (作者) 

  • 书  号:978-7-121-34314-8
  • 出版日期:2018-08-16
  • 页  数:268
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:张春雨
电子书 ¥39.00
购买电子书
纸质版 ¥69.00
经过多年的发展,大数据处理技术逐步成熟。作为业界大数据计算的事实标准,Apache Spark系统已经广泛应用于各大企业与研究机构,并形成完整的生态系统。Spark系统包含了SQL、GraphX和R等各个子系统以支持不同业务领域的需求。作为传统关系数据库/数据仓库在大数据场景下的解决方案,Spark SQL已经成为了业界的重要选择方案,同时也成为了Spark开源社区中最为活跃的部分。本书聚焦于Spark SQL系统,对其整体架构、内部各个模块的技术实现机制进行源码级别的剖析,涉及到SQL编译、逻辑计划、物理执行计划、重要查询(如Aggregation与Join等)的技术细节。此外,本书内容上还会结合生产环境的海量应用,分享大量真实开发案例与实践优化经验。
本书的内容最初是腾讯内部为进行 Spark SQL 开发而整理的技术文档,最后剥离出通用的 部分集结成册。从数据的维度来看,无论是单机还是分布式环境,SQL 对用户来说都是非常重 要的。Spark SQL 作为腾讯大数据平台中最基础的部分,支撑全公司的数据分析业务。因此,书
中的内容并非是针对 Spark SQL 技术的空谈,而是立足于腾讯大数据平台的大量实践经验。 本书的几位作者正是工作在腾讯大数据一线的工程师和技术专家,在日均百万级别的SQL业务处理和优化中积累了丰富的经验。综观全书,条理非常清晰,读者既能在高度上知晓来龙 去脉和他山之石,又能在深度上体会源码级别的技术点剖析。同时,书中结合实践展示了一些 通用案例,避免读者陷入到代码的汪洋大海中。
推荐序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 深度学习基金会(LF Deep Learning)。
除代码层面的开源外,近年来,腾讯也把大数据能力开放给传统企业,我们服务了政务民 生、金融、交通、零售、教育、工业等各行各业的用户,旨在让没有大数据人才的企业也能具 备使用大数据的能力。我们乐于把腾讯积累了十年的大数据技术和运维经验对外分享、对外输出,本书也可以看作是腾讯大数据技术开放的一部分。
本书的内容最初是腾讯内部为进行 Spark SQL 开发而整理的技术文档,最后剥离出通用的 部分集结成册。从数据的维度来看,无论是单机还是分布式环境,SQL 对用户来说都是非常重 要的。Spark SQL 作为腾讯大数据平台中最基础的部分,支撑全公司的数据分析业务。因此,书 中的内容并非是针对 Spark SQL 技术的空谈,而是立足于腾讯大数据平台的大量实践经验。 本书的几位作者正是工作在腾讯大数据一线的工程师和技术专家,在日均百万级别的SQL业务处理和优化中积累了丰富的经验。综观全书,条理非常清晰,读者既能在高度上知晓来龙 去脉和他山之石,又能在深度上体会源码级别的技术点剖析。同时,书中结合实践展示了一些 通用案例,避免读者陷入到代码的汪洋大海中。
于我个人而言,大学毕业后在传统的银行工作。后来,在数据爆发的时代,我有幸在国内 数据最多的两家公司工作,我在阿里巴巴负责支付宝 BI 数据平台基础架构和应用架构,来到腾 讯后一直负责腾讯的大数据业务。十多年的职业生涯,转换了公司,也转换了工作和生活的城 市,但一直不变的是我的工作始终围绕着“数据”展开,无论是在传统 IT 行业,还是在互联网 行业,“数据”始终是我工作的核心内容,而我自己最大的职业追求也离不开“数据”。
未来,在人们的生活中,数据将无时无刻无处不在,数据与商业的真正结合将爆发出强大 的生命力和价值。作为服务于上层业务的基础支撑平台,最重要的地方在于技术的沉淀和积累, 不断打磨优化。从技术研发人员的角度来讲,最重要的是修炼好自己的“内功”,不忘初心。最 后,希望每一位读者都能够从本书中有所收获,练好数据的“内功”,与数据结缘。

蒋杰 博士 腾讯首席数据官、腾讯数据平台部总经理
CCF 大数据专家委员会委员
2018 年 7 月



推荐序2
非常高兴收到了师弟朱锋、张博士和明哥关于 Spark SQL 的书稿,也非常荣幸被邀请为本 书作友情序言。本人是朱锋在中科院软件所读博时的师兄,2014 年也曾经在明哥组内实习,目 前在中科院从事大数据方面的科研工作,主要关注 Spark/Flink 等大数据处理系统及大数据分析 算法,之前也在 GitHub 上写过 SparkInternals 等介绍技术原理的文章。
去年就听闻师弟他们在写一本关于 Spark SQL 的书,希望能够将生产环境中平台开发建设 的一些经验总结出来。当时感觉有些惊讶,惊讶师弟从学术界到工业界能够快速转变,短时间 内深入理解了整个系统,并能将经验总结成书。后来想了一下,这也是在情理之中的。朱锋的 博士论文的内容就和 SQL-on-Hadoop 解决方案相关,在 Hadoop、Hive、HBase 等系统上也积累 了多年的开发应用经验,在腾讯接触工业界实际案例后能够迅速应用所学知识,加上读博期间 训练出来的抽象表达能力,与张博士一起,在明哥的全力支持下,足以写出一本有深度的技术 图书。
虽然是熟人,但刚收到书时,我也有着顾虑。相信大多数读者也是如此,就是想知道这本 书是否值得读,讲没讲干货,能否让读者快速理解 Spark SQL 的原理,能否对读者的实际工作 有用。带着这些问题,我开始了阅读,发现越读干货越多,从 Spark SQL 历史到 Spark SQL 语法 解析,从逻辑执行计划和物理执行计划生成,继续往下切入到 Tungsten 内存管理,全面讲述了 Spark SQL 技术的方方面面,不仅有原理介绍,还有实现细节的描述和总结,更有在海量数据和 海量业务下的实践经验的总结。这些对想深入理解 Spark SQL,并对其进行优化改进,以及想更 高效地使用 Spark SQL 的开发者、用户都有莫大的帮助。
抱着学习的态度读完本书,我在以下几个方面受益匪浅:逻辑执行计划、物理执行计划、 优化方法等背后的技术原理,本书均透彻地讲清楚了。在读的过程中,我也在感概,记得前几 年带组里的师弟师妹们想在 Spark SQL 中添加关键词查询功能(类似 MySQL 中的 MATCH 关键 词),发现需要在 Spark SQL 中添加新语法、改进语法解析、对翻译生成执行计划等一系列模块 进行改进,由于当时缺少 Spark SQL 技术体系引导和深入解析的书籍,因此我们花了不少时间 扎入代码,并自行总结技术体系和实现原理。本书的内容对于想对 Spark SQL 进行二次开发的 读者非常有用,可以让二次开发事半功倍。
因为平时工作需要写论文,同时也会写技术报告和文档,所以深知写一本简洁易懂又包含 复杂技术知识的图书有多困难,不仅需要花费大量精力阅读代码、分析细节,还需要在高层进 行抽象总结、简洁表达。在阅读本书的过程中,可以从字里行间感受到作者们的用心和付出的 努力。例如,作者在讲解 ANTLR 4 时,首先自己设计一个简单的例子,并进行相应的代码实现, 在生成逻辑算子树时用到的访问者模式也会以实例进行说明。在技术展现方面,要画出图3.8、 图 7.10 等,不仅需要仔细阅读代码中的每个类的实现,而且需要考虑图形布局以达到直观的效 果。
Spark 是一个易用性、通用性都很高的框架,除 Spark SQL 外,上层还有面向图计算的 GraphX 框架、机器学习 MLlib 库,流处理的 Spark Streaming 库,希望包括几位作者在内的业界 专家能够为读者带来更多高水平的解析和总结。Spark SQL 本身也在演变中,希望本书有第二 版、第三版等,能够不断加入更多的技术解析,不断完善。作为一名研究者,我自己也会努力去设计实现更多能够解决大数据实际问题的系统和方法,共勉之。

许利杰 (@JerryLead) http://www.tcse.cn/?xulijie/
中科院软件所
2018 年 6 月 15 日


前言
极其迅速的信息传播将人们带入了大数据时代,也推动了大数据技术的发展。Spark 于 2009 年诞生于伯克利大学 AMP 实验室,至今已经形成完整的生态圈。除参与度高的开源社区外,各 种相关的技术分享和论坛(如每年的 Spark Summit)也是如火如荼。得益于其灵活的 RDD 计算 模型,Spark 系统高效地支持了各类应用,涉及 SQL 处理、图计算和机器学习等。
本书重点讲解 Spark SQL,该系统在企业中的应用非常广泛,也是 Spark 生态圈中较活跃的 部分。从另一个视角来看,Spark SQL 是近年来 SQL-on-Hadoop 解决方案(包括 Hive、Presto 和 Impala 等)中的佼佼者,结合了数据库 SQL 处理和 Spark 分布式计算模型两个方面的技术,目 标是取代传统的数据仓库。
在实际生产环境中,因为一些个性化的需求,往往涉及对原生的 Spark SQL 系统进行定制 化的改造或新特性的添加,此过程需要开发人员对内部实现有深入的了解。然而笔者发现,目 前业界在这方面的资料还比较缺乏,虽然已经涌现了一系列的文章和书籍,但内容通常都以 Spark 本身为主,或者停留在 API 使用和概括性介绍层面,难以满足开发人员的需求。
本书定位于弥补这方面的空白,对 Spark 的基本概念和功能(如 RDD 和调度等)不再展开 讲解,而是将内容重点放在 SQL 内核实现的剖析上,旨在同读者一起“入于其中”,从源码实 现上学习分布式计算和数据库领域的相关技术。

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

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

一些约定和说明
? 相关术语:Spark 依赖于 JVM,主体采用 Scala 开发语言,部分功能也用到了 Java 语言来 实现。本书没有严格地区分两种语言的术语,例如 Scala 语言中的 trait(特质)和 Java 语 言中的 interface(接口)等,书中一般以 Java 语言的术语为主。此外,本书涉及的源码分 析较多,不方便直接翻译的类或接口命名,以其英文命名为主。一些 SQL 关键词(例如 Select、Join 等)或 Spark 术语(例如 Shuffle、Partition、Executor 等)在不同上下文环境中 也会出现大小写混用的情况。另外,Map 和 Reduce 虽然是来自 MapReduce 中的概念,但 本书在介绍 Spark SQL 时也使用了这两个概念,分别用来表示 Shuffle 前的阶段和 Shuffle 后的阶段。
? 版本说明:本书使用的 Spark 版本是 Spark 2.X。笔者在写作时,以 2.1 版本和 2.2 版本中的 实现机制为主。然而,Spark 社区活跃,版本的演化非常迅速(平均半年一个版本),读者 在理解基本的框架和思路后可以结合 JIRA 上的相关 Issue 和对应的 Patch 进行跟踪。当然, 后期最好的方式是参与到社区的贡献中。
? 推荐的阅读方式:本书内容涉及的实现细节较多,因此建议的阅读方式是结合代码进行理 解。调试环境搭建好之后,在关键步骤插入日志信息,纵向(宏观)和横向(细节)分析 交叉进行,最终做到在脑海中将上层的 SQL 语句映射为底层的 RDD 模型。

前沿技术的整理和分析并不是一件轻松的工作,从大纲的确定、内容的选择到最终出版得 益于多方的大力支持。在此感谢电子工业出版社的各位编辑对本书出版提供的帮助,感谢马朋 勃、马骉和邓飞等提出的宝贵修改建议。写作是一个不断学习并进行归纳和整理的过程,笔者 在写作中也受到相关技术博客和论文思路的启发,在此一并感谢。
因笔者水平有限,本书的错漏和不足之处欢迎广大读者朋友批评指证。如果有更好的建议, 也欢迎通过电子邮件联系几位作者:朱锋(wellfengzhu@gmail.com)、张韶全(shaoquan.zhang@ hotmail.com)和黄明(andyyehoo@gmail.com)。

目录

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

读者评论

电子书版本

  • Epub

相关图书

Python统计可视化之Altair探索分析实践指南

刘大成 (作者)

本书以Altair为核心工具,通过认识数据、理解数据和探索数据全方位地探索分析数据集的统计可视化形式,以应用数据和案例研究为实践场景,使用Altair数据加工箱...

 

实用推荐系统

Kim Falk (作者) 李源 朱罡罡 温睿 (译者)

要构建一个实用的“智能”推荐系统,不仅需要有好的算法,还需要了解接收推荐的用户。本书分为两部分,第一部分侧重于基础架构,主要介绍推荐系统的工作原理,展示如何创建...

¥119.00

Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)

龚正 吴治辉 闫健勇 (作者)

Kubernetes是由谷歌开源的容器集群管理系统,为容器化应用提供了资源调度、部署运行、服务发现、扩缩容等一整套功能。Kubernetes也是将“一切以服务(...

 

Harbor权威指南

张海宁 邹佳 王岩 尹文开 任茂盛 等 (作者)

在云原生生态中,容器镜像和其他云原生制品的管理与分发是至关重要的一环。本书对开源云原生制品仓库Harbor展开全面讲解,由Harbor开源项目维护者和贡献者倾力...

 

集成学习:基础与算法

Zhi-Hua Zhou (作者) 李楠 (译者)

集成学习方法是一类先进的机器学习方法,这类方法训练多个学习器并将它们结合起来解决一个问题,在实践中获得了巨大成功。<br>全书分为三部分。第一部分主要介绍集成学...

¥89.00

Kubernetes源码剖析

郑东旭 (作者)

本书主要分析了Kubernetes核心功能的实现原理,是一本帮助读者了解Kubernetes架构设计及内部原理实现的书。由于Kubernetes代码量较大,源码...