《Apache Spark源码剖析》

Spark Contributor,Databricks工程师连城,华为大数据平台开发部部长陈亮,网易杭州研究院副院长汪源,TalkingData首席数据科学家张夏天联袂力荐
1.本书全面、系统地介绍了Spark源码,深入浅出,细致入微
2.提供给读者一系列分析源码的实用技巧,并给出一个合理的阅读顺序
3.始终抓住资源分配、消息传递、容错处理等基本问题,抽丝拨茧
4.一步步寻找答案,所有问题迎刃而解,使读者知其然更知其所以然

内容简介

书籍
计算机书籍
《Apache Spark源码剖析》以Spark 1.02版本源码为切入点,着力于探寻Spark所要解决的主要问题及其解决办法,通过一系列精心设计的小实验来分析每一步背后的处理逻辑。

《Apache Spark源码剖析》第3~5章详细介绍了Spark
Core中作业的提交与执行,对容错处理也进行了详细分析,有助读者深刻把握Spark实现机理。第6~9章对Spark
Lib库进行了初步的探索。在对源码有了一定的分析之后,读者可尽快掌握Spark技术。

《Apache Spark源码剖析》对于Spark应用开发人员及Spark集群管理人员都有极好的学习价值;对于那些想从源码学习而又不知如何入手的读者,也不失为一种借鉴。

作译者

许鹏长期致力于电信领域和互联网的软件研发,在数据处理方面积累了大量经验,对系统的可扩展性、可靠性方面进行过深入学习和研究。因此,累积了大量的源码
阅读和分析的技巧与方法。目前在杭州同盾科技担任大数据平台架构师一职。对于Linux内核,作者也曾进行过深入的分析。

目录

第一部分Spark概述1

第1章初识Spark 3

1.1 大数据和Spark 3

1.1.1 大数据的由来4

1.1.2 大数据的分析4

1.1.3 Hadoop 5

1.1.4 Spark简介6

1.2 与Spark的第一次亲密接触7

1.2.1 环境准备7

1.2.2 下载安装Spark 8

1.2.3 Spark下的WordCount 8

第二部分Spark核心概念13

第2章Spark整体框架 15

2.1 编程模型15

2.1.1 RDD 17

2.1.2 Operation 17

2.2 运行框架18

2.2.1 作业提交18

2.2.2 集群的节点构成18

2.2.3 容错处理19

2.2.4 为什么是Scala 19

2.3 源码阅读环境准备19

2.3.1 源码下载及编译19

2.3.2 源码目录结构21

2.3.3 源码阅读工具21

2.3.4 本章小结22

第3章SparkContext初始化 23

3.1 spark-shell 23

3.2 SparkContext的初始化综述27

3.3 Spark Repl综述30

3.3.1 Scala Repl执行过程31

3.3.2 Spark Repl 32

第4章Spark作业提交 33

4.1 作业提交33

4.2 作业执行38

4.2.1 依赖性分析及Stage划分39

4.2.2 Actor Model和Akka 46

4.2.3 任务的创建和分发47

4.2.4 任务执行53

4.2.5 Checkpoint和Cache 62

4.2.6 WebUI和Metrics 62

4.3 存储机制71

4.3.1 Shuffle结果的写入和读取71

4.3.2 Memory Store 80

4.3.3 存储子模块启动过程分析81

4.3.4 数据写入过程分析82

4.3.5 数据读取过程分析84

4.3.6 TachyonStore 88

第5章部署方式分析 91

5.1 部署模型91

5.2 单机模式local 92

5.3 伪集群部署local-cluster 93

5.4 原生集群Standalone Cluster 95

5.4.1 启动Master 96

5.4.2 启动Worker 97

5.4.3 运行spark-shell 102

5.4.4 容错性分析106

5.5 Spark On YARN 112

5.5.1 YARN的编程模型112

5.5.2 YARN中的作业提交112

5.5.3 Spark On YARN实现详解113

5.5.4 SparkPi on YARN 122

第三部分Spark Lib 129

第6章Spark Streaming 131

6.1 Spark Streaming整体架构131

6.1.1 DStream 132

6.1.2 编程接口133

6.1.3 Streaming WordCount 134

6.2 Spark Streaming执行过程135

6.2.1 StreamingContext初始化过程136

6.2.2 数据接收141

6.2.3 数据处理146

6.2.4 BlockRDD 155

6.3 窗口操作158

6.4 容错性分析159

6.5 Spark Streaming vs. Storm 165

6.5.1 Storm简介165

6.5.2 Storm和Spark Streaming对比168

6.6 应用举例168

6.6.1 搭建Kafka Cluster 168

6.6.2 KafkaWordCount 169

第7章SQL 173

7.1 SQL语句的通用执行过程分析175

7.2 SQL On Spark的实现分析178

7.2.1 SqlParser 178

7.2.2 Analyzer 184

7.2.3 Optimizer 191

7.2.4 SparkPlan 192

7.3 Parquet 文件和JSON数据集196

7.4 Hive简介197

7.4.1 Hive 架构197

7.4.2 HiveQL On MapReduce执行过程分析199

7.5 HiveQL On Spark详解200

7.5.1 Hive On Spark环境搭建206

7.5.2 编译支持Hadoop 2.x的Spark 211

7.5.3 运行Hive On Spark测试用例213

第8章GraphX 215

8.1 GraphX简介215

8.1.1 主要特点216

8.1.2 版本演化216

8.1.3 应用场景217

8.2 分布式图计算处理技术介绍218

8.2.1 属性图218

8.2.2 图数据的存储与分割219

8.3 Pregel计算模型220

8.3.1 BSP 220

8.3.2 像顶点一样思考220

8.4 GraphX图计算框架实现分析223

8.4.1 基本概念223

8.4.2 图的加载与构建226

8.4.3 图数据存储与分割227

8.4.4 操作接口228

8.4.5 Pregel在GraphX中的源码实现230

8.5 PageRank 235

8.5.1 什么是PageRank 235

8.5.2 PageRank核心思想235

第9章MLLib 239

9.1 线性回归239

9.1.1 数据和估计240

9.1.2 线性回归参数求解方法240

9.1.3 正则化245

9.2 线性回归的代码实现246

9.2.1 简单示例246

9.2.2 入口函数train 247

9.2.3 最优化算法optimizer 249

9.2.4 权重更新update 256

9.2.5 结果预测predict 257

9.3 分类算法257

9.3.1 逻辑回归258

9.3.2 支持向量机260

9.4 拟牛顿法261

9.4.1 数学原理261

9.4.2 代码实现265

9.5 MLLib与其他应用模块间的整合268

第四部分附录271

附录A Spark源码调试 273

附录B 源码阅读技巧 283

↑折 叠

前言

  笔者接触Spark时间不算很长,而本书之所以能够出版,凭借的是浓厚的兴趣和执着之心。

  这一切还要从Storm说起。笔者一直在做互联网相关工作,但接触大数据的时间并不长,当时Hadoop和Storm等非常红火,引起了笔者的"窥
视"之心。从2013年开始,笔者打算看看Hadoop的源码实现,观察其代码规模,发觉所花时间可能会很长。恰好其时Storm风头正劲,于是转向
Storm源码,0.8版的Storm代码规模不过20 000行左右,感觉还是比较好入手的。

  Storm源码分析期间,笔者还学习了Clojure、ZeroMQ、Thrift、ZooKeeper、LMAX
Disruptor等新技术,对于实时流数据处理算是有了一个大概的了解。由于听说在实时流数据处理领域Spark技术也很强悍,而且在容错性方面具有天
生的优势,更引发了笔者的兴趣,为了弄清楚究竟,于是开始了Spark的源码走读过程。

  笔者是以读Spark论文开始的,说老实话觉得晦涩难懂,因为无法将其映射到内存使用、进程启动、线程运行、消息传递等基本问题上。或许换个方法会更
好,故笔者选择直接从源码入手,如此一来事情反而变简单了。在源码分析的过程中,笔者始终抓住资源分配、消息传递、容错处理等基本问题设问,然后一步步努
力寻找答案,所有的问题渐渐迎刃而解。

  笔者关于源码分析有一个心得,就是要紧紧把握住计算的基本模型,然后结合新分析问题的业务领域,将业务上的新问题转换到计算处理的老套路上来,然后就
可以以不变应万变,而不被一些新技术名词晃花了眼。这里所说的老套路是指从操作系统的角度来看,如果能事先深度了解操作系统,将对分析一些新应用程序大有
裨益。

  Spark源码采用Scala语言编写,那么阅读Spark源码之前,是否一定要先学Scala呢?笔者个人以为不必,只要你有一些Java或C++
编程语言的基础,就可以开始看Spark源码,遇到不懂的地方再去学习,效率反而会大大提高,做到有的放矢。将学习中遇到的知识点,从函数式编程、泛型编
程、面向对象、并行编程等几个方面去整理归纳,这样能够快速将Scala语言的框架勾勒出来。

  本书第1章和第2章简要介绍了大数据分析技术的产生背景和演进过程;第3~5章详细分析了Spark
Core中的作业规划、提交及任务执行等内容,对于要深刻把握Spark实现机理的读者来说,这几章值得反复阅读;第6~9章就Spark提供的高级
Lib库进行了简要的分析,分析的思路是解决的主要问题是什么、解决的方案是如何产生的,以及方案是如何通过代码来具体实现的。

  在对源码有了一定的分析和掌握之后,再回过头来看一下Spark相关的论文,这时候对论文的理解可能会更顺畅。

  Spark的整体框架非常庞大,涵盖的范围也很广,随着笔者在工作中使用得越来越具体,这样的感受也越来越深。另外,必须要说对于Spark来说,笔者所做的分析实在有限,个中错误在所难免,读者诸君还请多多谅解。

  在本书成稿期间,电子工业出版社的付睿编辑和李云静编辑给出了极为详细的改进意见,在这里表示衷心的感谢。最后感谢家人的支持和鼓励,亲爱的老婆和懂事的儿子给了笔者坚持的理由和勇气。

  许鹏

  2015年2月

媒体评论

  与Hadoop、Hive、Storm等老牌大数据系统相比,Spark的代码体积要小得多。然而这样一套精简的系统却同时承载了批处理、流处理、迭
代计算、关系查询、图计算等多种计算范式,再加上Scala和函数式编程并不为普通程序员所熟悉,阅读和分析Spark源码并不是一件特别轻松的事情。本
书记录了一系列分析Spark源码的实用技巧,并给出了一个合理的阅读顺序,相信可以令学习Spark的读者们事半功倍。 --Spark
Contributor,Databricks工程师 连城
  介绍Spark的书籍很多,但一般不够全面,而这本书非常系统全面地介绍了Spark源码,深入浅出、细致入微,把Spark的由来、Spark整体
框架、Spark各软件栈、Spark环境搭建、Spark部署模式等从源码角度一步步剖析得非常清楚。作者有很强的系统设计、软件工程功底,读者不仅可
以从书中学到Spark知识,还可以学习到作者对新技术研究、源码研究很多好的方法和技巧。授人以鱼不如授人以渔,对在校大学生、Spark初学者、大数
据开发工程师来说,这本书非常值得拥有。 --华为大数据平台开发部部长 陈亮
  难以置信,薄薄的一本书可以兼具如此的广度与深度。除了Spark核心系统,本书还介绍了Streaming、SQL、GraphX、MLLib等扩
展库,内容相当全面。但更"赞"的是本书对Spark及各扩展库的运行机理,无不提纲挈领,一一阐明,让读者不但知其然,还能知其所以然。如果想在生产环
境中用好Spark,本书值得细读。
  --网易杭州研究院副院长 汪源
  Spark目前正在蓬勃发展,越来越多的公司把大数据计算任务迁移到Spark平台上来。Spark开发的学习曲线并不陡峭。但是处理大数据,需要的
不仅是逻辑正确的程序,还需要高性能的程序。如果想把Spark的性能挖掘到极致,那就需要深入了解Spark的设计思想和运行机制,而要了解这些,没有
比读源代码更直接的了。许鹏老师的这本书,对于那些没有时间、精力直接啃源代码或者对Scala语言还不太精通的读者来说是一个福音。
--TalkingData首席数据科学家 张夏天

时间: 2024-10-27 01:11:12

《Apache Spark源码剖析》的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: