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