猜你喜欢
Spark SQL内核剖析

Spark SQL内核剖析

书籍作者:朱锋 张韶全 黄明 ISBN:9787121343148
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:9216
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

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中国区早期研究者和布道者之一。

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

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

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

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

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

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

前言

极其迅速的信息传播将人们带入了大数据时代,也推动了大数据技术的发展。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 模型。

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

因笔者水平有限,本书的错漏和不足之处欢迎广大读者朋友批评指证。如果有更好的建议, 也欢迎通过电子邮件联系几位作者:朱锋([email protected])、张韶全(shaoquan.zhang@ hotmail.com)和黄明([email protected])。

目录

第 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 本章小结
总结
参考文献

标签
Spark,Scala,SQL