深入理解Spark:核心思想与源码分析. 导读

 

大数据技术丛书

 

深入理解Spark:核心思想与源码分析

耿嘉安 著

 

 

Preface 
前言

为什么写这本书

要回答这个问题,需要从我个人的经历说起。说来惭愧,我第一次接触计算机是在高三。当时跟大家一起去网吧玩CS,跟身边的同学学怎么“玩”。正是通过这种“玩”的过程,让我了解到计算机并没有那么神秘,它也只是台机器,用起来似乎并不比打开电视机费劲多少。高考填志愿的时候,凭着直觉“糊里糊涂”就选择了计算机专业。等到真正学习计算机课程的时候却又发现,它其实很难!

早在2004年,还在学校的我跟很多同学一样,喜欢看Flash,也喜欢谈论Flash甚至做Flash。感觉Flash正如它的名字那样“闪光”。那些年,在学校里,知道Flash的人可要比知道Java的人多得多,这说明当时的Flash十分火热。此外,Oracle也成为关系型数据库里的领军人物,很多人甚至觉得懂Oracle要比懂Flash、Java及其他数据库要厉害得多!

2007年,我刚刚参加工作不久。那时Struts1、Spring、Hibernate几乎可以称为那些用Java作为开发语言的软件公司的三驾马车。很快,Struts2替代了Struts1的地位,让我第一次意识到IT领域的技术更新竟然如此之快!随着很多传统软件公司向互联网公司转型,Hibernate也难以确保其地位,iBATIS诞生了!

2010年,有关Hadoop的技术图书涌入中国,当时很多公司用它只是为了数据统计、数据挖掘或者搜索。一开始,人们对于Hadoop的认识和使用可能相对有限。大约2011年的时候,关于云计算的概念在网上炒得火热,当时依然在做互联网开发的我,对其只是“道听途说”。后来跟同事借了一本有关云计算的书,回家挑着看了一些内容,也没什么收获,怅然若失!20世纪60年代,美国的军用网络作为互联网的雏形,很多内容已经与云计算中的某些说法类似。到20世纪80年代,互联网就已经启用了云计算,如今为什么又要重提这样的概念?这个问题我可能回答不了,还是交给历史吧。

2012年,国内又呈现出大数据热的态势。从国家到媒体、教育、IT等几乎所有领域,人人都在谈大数据。我的亲戚朋友中,无论老师、销售人员,还是工程师们都可以针对大数据谈谈自己的看法。我也找来一些Hadoop的书籍进行学习,希望能在其中探索到大数据的奥妙。

有幸在工作过程中接触到阿里的开放数据处理服务(open data processing service,ODPS),并且基于ODPS与其他小伙伴一起构建阿里的大数据商业解决方案—御膳房。去杭州出差的过程中,有幸认识和仲,跟他学习了阿里的实时多维分析平台—Garuda和实时计算平台—Galaxy的部分知识。和仲推荐我阅读Spark的源码,这样会对实时计算及流式计算有更深入的了解。2015年春节期间,自己初次上网查阅Spark的相关资料学习,开始研究Spark源码。还记得那时只是出于对大数据的热爱,想使自己在这方面的技术能力有所提升。

从阅读Hibernate源码开始,到后来阅读Tomcat、Spring的源码,我也在从学习源码的过程中成长,我对源码阅读也越来越感兴趣。随着对Spark源码阅读的深入,发现很多内容从网上找不到答案,只能自己“硬啃”了。随着自己的积累越来越多,突然有一天发现,我所总结的这些内容好像可以写成一本书了!从闪光(Flash)到火花(Spark),足足有11个年头了。无论是Flash、Java,还是Spring、iBATIS,我一直扮演着一个追随者,我接受这些书籍的洗礼,从未给予。如今我也是Spark的追随者,不同的是,我不再只想简单攫取,还要给予。

最后还想说一下,2016年是我从事IT工作的第10个年头,此书特别作为送给自己的10周年礼物。

本书特色

按照源码分析的习惯设计,从脚本分析到初始化再到核心内容,最后介绍Spark的扩展内容。整个过程遵循由浅入深、由深到广的基本思路。

本书涉及的所有内容都有相应的例子,以便于读者对源码的深入研究。

本书尽可能用图来展示原理,加速读者对内容的掌握。

本书讲解的很多实现及原理都值得借鉴,能帮助读者提升架构设计、程序设计等方面的能力。

本书尽可能保留较多的源码,以便于初学者能够在像地铁、公交这样的地方,也能轻松阅读。

读者对象

源码阅读是一项苦差事,人力和时间成本都很高,尤其是对于Spark陌生或者刚刚开始学习的人来说,难度可想而知。本书尽可能保留源码,使得分析过程不至于产生跳跃感,目的是降低大多数人的学习门槛。如果你是从事IT工作1~3年的新人或者是希望学习Spark核心知识的人,本书非常适合你。如果你已经对Spark有所了解或者已经在使用它,还想进一步提高自己,那么本书更适合你。

如果你是一个开发新手,对Java、Linux等基础知识不是很了解,那么本书可能不太适合你。如果你已经对Spark有深入的研究,本书也许可以作为你的参考资料。

总体说来,本书适合以下人群:

想要使用Spark,但对Spark实现原理不了解,不知道怎么学习的人;

大数据技术爱好者,以及想深入了解Spark技术内部实现细节的人;

有一定Spark使用基础,但是不了解Spark技术内部实现细节的人;

对性能优化和部署方案感兴趣的大型互联网工程师和架构师;

开源代码爱好者。喜欢研究源码的同学可以从本书学到一些阅读源码的方式与方法。

本书不会教你如何开发Spark应用程序,只是用一些经典例子演示。本书简单介绍Hadoop MapReduce、Hadoop YARN、Mesos、Tachyon、ZooKeeper、HDFS、Amazon S3,但不会过多介绍这些框架的使用,因为市场上已经有丰富的这类书籍供读者挑选。本书也不会过多介绍Scala、Java、Shell的语法,读者可以在市场上选择适合自己的书籍阅读。

如何阅读本书

本书分为三大部分(不包括附录):

准备篇(第1~2章),简单介绍了Spark的环境搭建和基本原理,帮助读者了解一些背景知识。

核心设计篇(第3~7章),着重讲解SparkContext的初始化、存储体系、任务提交与执行、计算引擎及部署模式的原理和源码分析。

扩展篇(第8~11章),主要讲解基于Spark核心的各种扩展及应用,包括:SQL处理引擎、Hive处理、流式计算框架Spark Streaming、图计算框架GraphX、机器学习库MLlib等内容。

本书最后还添加了几个附录,包括:附录A介绍的Spark中最常用的工具类Utils;附录B是Akka的简介与工具类AkkaUtils的介绍;附录C为Jetty的简介和工具类JettyUtils的介绍;附录D为Metrics库的简介和测量容器MetricRegistry的介绍;附录E演示了Hadoop1.0版本中的word count例子;附录F介绍了工具类CommandUtils的常用方法;附录G是关于Netty的简介和工具类NettyUtils的介绍;附录H列举了笔者编译Spark源码时遇到的问题及解决办法。

为了降低读者阅读理解Spark源码的门槛,本书尽可能保留源码实现,希望读者能够怀着一颗好奇的心,Spark当前很火热,其版本更新也很快,本书以Spark 1.2.3版本为主,有兴趣的读者也可按照本书的方式,阅读Spark的最新源码。

勘误和支持

本书内容很多,限于笔者水平有限,书中内容难免有错误之处。在本书出版后的任何时间,如果你对本书有任何问题或者意见,都可以通过邮箱[email protected]或博客http://www.cnblogs.com/jiaan-geng/联系我,说出你的建议或者想法,希望与大家共同进步。

致谢

感谢苍天,让我生活在这样一个时代,能接触互联网和大数据;感谢父母,这么多年来,在学习、工作及生活上的帮助与支持;感谢妻子在生活中的照顾和谦让。

感谢杨福川和高婧雅给予本书出版的大力支持与帮助。

感谢冰夷老大和王贲老大让我有幸加入阿里,接触大数据应用;感谢和仲对Galaxy和Garuda耐心细致的讲解以及对Spark的推荐;感谢张中在百忙之中给本书写评语;感谢周亮、澄苍、民瞻、石申、清无、少侠、征宇、三步、谢衣、晓五、法星、曦轩、九翎、峰阅、丁卯、阿末、紫丞、海炎、涵康、云飏、孟天、零一、六仙、大知、井凡、隆君、太奇、晨炫、既望、宝升、都灵、鬼厉、归钟、梓撤、昊苍、水村、惜冰、惜陌、元乾等同仁在工作上的支持和帮助。

 

耿嘉安 于北京

 

准 备 篇

第1章 环境准备2

1.1 运行环境准备2

1.1.1 安装JDK3

1.1.2 安装Scala3

1.1.3 安装Spark4

1.2 Spark初体验4

1.2.1 运行spark-shell4

1.2.2 执行word count5

1.2.3 剖析spark-shell7

1.3 阅读环境准备11

1.4 Spark源码编译与调试13

1.5 小结17

第2章 Spark设计理念与基本架构18

2.1 初识Spark18

2.1.1 Hadoop MRv1的局限18

2.1.2 Spark使用场景20

2.1.3 Spark的特点20

2.2 Spark基础知识20

2.3 Spark基本设计思想22

2.3.1 Spark模块设计22

2.3.2 Spark模型设计24

2.4 Spark基本架构25

2.5 小结26

核心设计篇

第3章 SparkContext的初始化28

3.1 SparkContext概述28

3.2 创建执行环境SparkEnv30

3.2.1 安全管理器SecurityManager31

3.2.2 基于Akka的分布式消息系统ActorSystem31

3.2.3 map任务输出跟踪器mapOutputTracker32

3.2.4 实例化ShuffleManager34

3.2.5 shuffle线程内存管理器ShuffleMemoryManager34

3.2.6 块传输服务BlockTransferService35

3.2.7 BlockManagerMaster介绍35

3.2.8 创建块管理器BlockManager36

3.2.9 创建广播管理器Broadcast-Manager36

3.2.10 创建缓存管理器CacheManager37

3.2.11 HTTP文件服务器HttpFile-Server37

3.2.12 创建测量系统MetricsSystem39

3.2.13 创建SparkEnv40

3.3 创建metadataCleaner41

3.4 SparkUI详解42

3.4.1 listenerBus详解43

3.4.2 构造JobProgressListener46

3.4.3 SparkUI的创建与初始化47

3.4.4 Spark UI的页面布局与展示49

3.4.5 SparkUI的启动54

3.5 Hadoop相关配置及Executor环境变量54

3.5.1 Hadoop相关配置信息54

3.5.2 Executor环境变量54

3.6 创建任务调度器TaskScheduler55

3.6.1 创建TaskSchedulerImpl55

3.6.2 TaskSchedulerImpl的初始化57

3.7 创建和启动DAGScheduler57

3.8 TaskScheduler的启动60

3.8.1 创建LocalActor60

3.8.2 ExecutorSource的创建与注册62

3.8.3 ExecutorActor的构建与注册64

3.8.4 Spark自身ClassLoader的创建64

3.8.5 启动Executor的心跳线程66

3.9 启动测量系统MetricsSystem69

3.9.1 注册Sources70

3.9.2 注册Sinks70

3.9.3 给Sinks增加Jetty的Servlet-ContextHandler71

3.10 创建和启动ExecutorAllocation-Manager72

3.11 ContextCleaner的创建与启动73

3.12 Spark环境更新74

3.13 创建DAGSchedulerSource和BlockManagerSource76

3.14 将SparkContext标记为激活77

3.15 小结78

 

时间: 2017-05-02

深入理解Spark:核心思想与源码分析. 导读的相关文章

《深入理解Spark:核心思想与源码分析》——2.3节Spark基本设计思想

2.3 Spark基本设计思想2.3.1 Spark模块设计 整个Spark主要由以下模块组成: Spark Core:Spark的核心功能实现,包括:SparkContext的初始化(Driver Application通过SparkContext提交).部署模式.存储体系.任务提交与执行.计算引擎等. Spark SQL:提供SQL处理能力,便于熟悉关系型数据库操作的工程师进行交互查询.此外,还为熟悉Hadoop的用户提供Hive SQL处理能力. Spark Streaming:提供流式计

《深入理解Spark:核心思想与源码分析》——第1章环境准备

第1章 环 境 准 备 凡事豫则立,不豫则废:言前定,则不跲:事前定,则不困. -<礼记·中庸> 本章导读 在深入了解一个系统的原理.实现细节之前,应当先准备好它的源码编译环境.运行环境.如果能在实际环境安装和运行Spark,显然能够提升读者对于Spark的一些感受,对系统能有个大体的印象,有经验的技术人员甚至能够猜出一些Spark采用的编程模型.部署模式等.当你通过一些途径知道了系统的原理之后,难道不会问问自己:"这是怎么做到的?"如果只是游走于系统使用.原理了解的层面,

《深入理解Spark:核心思想与源码分析》——第3章SparkContext的初始化

第3章 SparkContext的初始化 道生一, 一生二, 二生三, 三生万物. -<道德经> 本章导读 SparkContext的初始化是Driver应用程序提交执行的前提,本章内容以local模式为主,并按照代码执行顺序讲解,这将有助于首次接触Spark的读者理解源码.读者朋友如果能边跟踪代码,边学习本章内容,也许是快速理解SparkContext初始化过程的便捷途径.已经熟练使用Spark的开发人员可以选择跳过本章内容. 本章将在介绍SparkContext初始化过程的同时,向读者介绍

《深入理解Spark:核心思想与源码分析》——1.4节Spark源码编译与调试

1.4 Spark源码编译与调试 1.下载Spark源码 首先,访问Spark官网http://spark.apache.org/,如图1-18所示. 2.构建Scala应用 使用cmd命令行进到Spark根目录,执行sbt命令.会下载和解析很多jar包,要等很长时间,笔者大概花了一个多小时才执行完. 3.使用sbt生成Eclipse工程文件 等sbt提示符(>)出现后,输入Eclipse命令,开始生成Eclipse工程文件,也需要花费很长时间,笔者本地大致花了40分钟.完成时的状况如图1-21

《深入理解Spark:核心思想与源码分析》——3.1节SparkContext概述

3.1 SparkContext概述 Spark Driver用于提交用户应用程序,实际可以看作Spark的客户端.了解Spark Driver的初始化,有助于读者理解用户应用程序在客户端的处理过程. Spark Driver的初始化始终围绕着SparkContext的初始化.SparkContext可以算得上是所有Spark应用程序的发动机引擎,轿车要想跑起来,发动机首先要启动.SparkContext初始化完毕,才能向Spark集群提交任务.在平坦的公路上,发动机只需以较低的转速.较低的功率

《深入理解Spark:核心思想与源码分析》——1.5节小结

1.5 小结 本章通过引导大家在Linux操作系统下搭建基本的执行环境,并且介绍spark-shell等脚本的执行,来帮助读者由浅入深地进行Spark源码的学习.由于目前多数开发工作都在Windows系统下进行,并且Eclipse有最广大的用户群,即便是一些开始使用IntelliJ的用户对Eclipse也不陌生,所以在Windows环境下搭建源码阅读环境时,选择这些最常用的工具,能降低读者的学习门槛,并且替大家节省时间.

《深入理解Spark:核心思想与源码分析》——2.2节Spark基础知识

2.2 Spark基础知识 1.版本变迁 经过4年多的发展,Spark目前的版本是1.4.1.我们简单看看它的版本发展过程. 1)Spark诞生于UCBerkeley的AMP实验室(2009). 2)Spark正式对外开源(2010年). 3)Spark 0.6.0版本发布(2012-10-15),进行了大范围的性能改进,增加了一些新特性,并对Standalone部署模式进行了简化. 4)Spark 0.6.2版本发布(2013-02-07),解决了一些bug,并增强了系统的可用性. 5)Spa

《深入理解Spark:核心思想与源码分析》——3.6节创建任务调度器TaskScheduler

3.6 创建任务调度器TaskScheduler TaskScheduler也是SparkContext的重要组成部分,负责任务的提交,并且请求集群管理器对任务调度.TaskScheduler也可以看做任务调度的客户端.创建TaskScheduler的代码如下. private[spark] var (schedulerBackend, taskScheduler) = SparkContext.createTaskScheduler(this, master) createTaskSchedu

《深入理解Spark:核心思想与源码分析》——2.4节Spark基本架构

2.4 Spark基本架构从集群部署的角度来看,Spark集群由以下部分组成:Cluster Manager:Spark的集群管理器,主要负责资源的分配与管理.集群管理器分配的资源属于一级分配,它将各个Worker上的内存.CPU等资源分配给应用程序,但是并不负责对Executor的资源分配.目前,Standalone.YARN.Mesos.EC2等都可以作为Spark的集群管理器.Worker:Spark的工作节点.对Spark应用程序来说,由集群管理器分配得到资源的Worker节点主要负责以

《深入理解Spark:核心思想与源码分析》——3.7节创建和启动DAGScheduler

3.7 创建和启动DAGSchedulerDAGScheduler主要用于在任务正式交给TaskSchedulerImpl提交之前做一些准备工作,包括:创建Job,将DAG中的RDD划分到不同的Stage,提交Stage,等等.创建DAG-Scheduler的代码如下. @volatile private[spark] var dagScheduler: DAGScheduler = _ dagScheduler = new DAGScheduler(this) DAGScheduler的数据结