深入理解Spark:核心思想与源码分析.html.pdf
《深入理解Spark:核心思想与源码分析.html.pdf》由会员分享,可在线阅读,更多相关《深入理解Spark:核心思想与源码分析.html.pdf(291页珍藏版)》请在三一文库上搜索。
1、前言 为什么写这本书 要回答这个问题,需要从我个人的经历说起。说来惭愧,我第一次接触计算机是在高三。当时跟大家一起去网吧玩CS,跟身边的同学学怎么“玩”。正是通过这种“玩”的过程,让我了解到计算机并 没有那么神秘,它也只是台机器,用起来似乎并不比打开电视机费劲多少。高考填志愿的时候,凭着直觉“糊里糊涂”就选择了计算机专业。等到真正学习计算机课程的时候却又发现,它其实很难! 早在2004年,还在学校的我跟很多同学一样,喜欢看Flash,也喜欢谈论Flash甚至做Flash。感觉Flash正如它的名字那样“闪光”。那些年,在学校里,知道Flash的人可要比知道Java的人多得多,这 说明当时的Fl
2、ash十分火热。此外,Oracle也成为关系型数据库里的领军人物,很多人甚至觉得懂Oracle要比懂Flash、Java及其他数据库要厉害得多! 2007年,我刚刚参加工作不久。那时Struts1、Spring、Hibernate几乎可以称为那些用Java作为开发语言的软件公司的三驾马车。很快,Struts2替代了Struts1的地位,让我第一次意识到IT领域的技 术更新竟然如此之快!随着很多传统软件公司向互联网公司转型,Hibernate也难以确保其地位,iBATIS诞生了! 2010年,有关Hadoop的技术图书涌入中国,当时很多公司用它只是为了数据统计、数据挖掘或者搜索。一开始,人们对于
3、Hadoop的认识和使用可能相对有限。大约2011年的时候,关于云计算的概 念在网上炒得火热,当时依然在做互联网开发的我,对其只是“道听途说”。后来跟同事借了一本有关云计算的书,回家挑着看了一些内容,也没什么收获,怅然若失!20世纪60年代,美国的军用网络作 为互联网的雏形,很多内容已经与云计算中的某些说法类似。到20世纪80年代,互联网就已经启用了云计算,如今为什么又要重提这样的概念?这个问题我可能回答不了,还是交给历史吧。 2012年,国内又呈现出大数据热的态势。从国家到媒体、教育、IT等几乎所有领域,人人都在谈大数据。我的亲戚朋友中,无论老师、销售人员,还是工程师们都可以针对大数据谈谈自
4、己的看法。我 也找来一些Hadoop的书籍进行学习,希望能在其中探索到大数据的奥妙。 有幸在工作过程中接触到阿里的开放数据处理服务(open data processing service,ODPS),并且基于ODPS与其他小伙伴一起构建阿里的大数据商业解决方案御膳房。去杭州出差的过程中, 有幸认识和仲,跟他学习了阿里的实时多维分析平台Garuda和实时计算平台Galaxy的部分知识。和仲推荐我阅读Spark的源码,这样会对实时计算及流式计算有更深入的了解。2015年春节期 间,自己初次上网查阅Spark的相关资料学习,开始研究Spark源码。还记得那时只是出于对大数据的热爱,想使自己在这方面
5、的技术能力有所提升。 从阅读Hibernate源码开始,到后来阅读Tomcat、Spring的源码,我也在从学习源码的过程中成长,我对源码阅读也越来越感兴趣。随着对Spark源码阅读的深入,发现很多内容从网上找不到答案, 只能自己“硬啃”了。随着自己的积累越来越多,突然有一天发现,我所总结的这些内容好像可以写成一本书了!从闪光(Flash)到火花(Spark),足足有11个年头了。无论是Flash、Java,还是 Spring、iBATIS,我一直扮演着一个追随者,我接受这些书籍的洗礼,从未给予。如今我也是Spark的追随者,不同的是,我不再只想简单攫取,还要给予。 最后还想说一下,2016年
6、是我从事IT工作的第10个年头,此书特别作为送给自己的10周年礼物。 本书特色 按照源码分析的习惯设计,从脚本分析到初始化再到核心内容,最后介绍Spark的扩展内容。整个过程遵循由浅入深、由深到广的基本思路。 本书涉及的所有内容都有相应的例子,以便于读者对源码的深入研究。 本书尽可能用图来展示原理,加速读者对内容的掌握。 本书讲解的很多实现及原理都值得借鉴,能帮助读者提升架构设计、程序设计等方面的能力。 本书尽可能保留较多的源码,以便于初学者能够在像地铁、公交这样的地方,也能轻松阅读。 读者对象 源码阅读是一项苦差事,人力和时间成本都很高,尤其是对于Spark陌生或者刚刚开始学习的人来说,难度
7、可想而知。本书尽可能保留源码,使得分析过程不至于产生跳跃感,目的是降低大多数人的 学习门槛。如果你是从事IT工作13年的新人或者是希望学习Spark核心知识的人,本书非常适合你。如果你已经对Spark有所了解或者已经在使用它,还想进一步提高自己,那么本书更适合你。 如果你是一个开发新手,对Java、Linux等基础知识不是很了解,那么本书可能不太适合你。如果你已经对Spark有深入的研究,本书也许可以作为你的参考资料。 总体说来,本书适合以下人群: 想要使用Spark,但对Spark实现原理不了解,不知道怎么学习的人; 大数据技术爱好者,以及想深入了解Spark技术内部实现细节的人; 有一定S
8、park使用基础,但是不了解Spark技术内部实现细节的人; 对性能优化和部署方案感兴趣的大型互联网工程师和架构师; 开源代码爱好者。喜欢研究源码的同学可以从本书学到一些阅读源码的方式与方法。 本书不会教你如何开发Spark应用程序,只是用一些经典例子演示。本书简单介绍Hadoop MapReduce、Hadoop YARN、Mesos、Tachyon、ZooKeeper、HDFS、Amazon S3,但不会过多介绍这 些框架的使用,因为市场上已经有丰富的这类书籍供读者挑选。本书也不会过多介绍Scala、Java、Shell的语法,读者可以在市场上选择适合自己的书籍阅读。 如何阅读本书 本书分
9、为三大部分(不包括附录): 准备篇(第12章),简单介绍了Spark的环境搭建和基本原理,帮助读者了解一些背景知识。 核心设计篇(第37章),着重讲解SparkContext的初始化、存储体系、任务提交与执行、计算引擎及部署模式的原理和源码分析。 扩展篇(第811章),主要讲解基于Spark核心的各种扩展及应用,包括:SQL处理引擎、Hive处理、流式计算框架Spark Streaming、图计算框架GraphX、机器学习库MLlib等内容。 本书最后还添加了几个附录,包括:附录A介绍的Spark中最常用的工具类Utils;附录B是Akka的简介与工具类AkkaUtils的介绍;附录C为Jet
10、ty的简介和工具类JettyUtils的介绍;附录D为Metrics库的 简介和测量容器MetricRegistry的介绍;附录E演示了Hadoop1.0版本中的word count例子;附录F介绍了工具类CommandUtils的常用方法;附录G是关于Netty的简介和工具类NettyUtils的介绍;附录H 列举了笔者编译Spark源码时遇到的问题及解决办法。 为了降低读者阅读理解Spark源码的门槛,本书尽可能保留源码实现,希望读者能够怀着一颗好奇的心,Spark当前很火热,其版本更新也很快,本书以Spark 1.2.3版本为主,有兴趣的读者也可按照本 书的方式,阅读Spark的最新源码
11、。 勘误和支持 本书内容很多,限于笔者水平有限,书中内容难免有错误之处。在本书出版后的任何时间,如果你对本书有任何问题或者意见,都可以通过邮箱或博 客http:/ 致谢 感谢苍天,让我生活在这样一个时代,能接触互联网和大数据;感谢父母,这么多年来,在学习、工作及生活上的帮助与支持;感谢妻子在生活中的照顾和谦让。 感谢杨福川和高婧雅给予本书出版的大力支持与帮助。 感谢冰夷老大和王贲老大让我有幸加入阿里,接触大数据应用;感谢和仲对Galaxy和Garuda耐心细致的讲解以及对Spark的推荐;感谢张中在百忙之中给本书写评语;感谢周亮、澄苍、民瞻、石申、 清无、少侠、征宇、三步、谢衣、晓五、法星、曦
12、轩、九翎、峰阅、丁卯、阿末、紫丞、海炎、涵康、云飏、孟天、零一、六仙、大知、井凡、隆君、太奇、晨炫、既望、宝升、都灵、鬼厉、归钟、梓 撤、昊苍、水村、惜冰、惜陌、元乾等同仁在工作上的支持和帮助。 耿嘉安 于北京 准备篇 第1章 环境准备 第2章 Spark设计理念与基本架构 第1章 环境准备 凡事豫则立,不豫则废;言前定,则不跲;事前定,则不困。 礼记中庸 本章导读 在深入了解一个系统的原理、实现细节之前,应当先准备好它的源码编译环境、运行环境。如果能在实际环境安装和运行Spark,显然能够提升读者对于Spark的一些感受,对系统能有个大体的印象,有 经验的技术人员甚至能够猜出一些Spark采
13、用的编程模型、部署模式等。当你通过一些途径知道了系统的原理之后,难道不会问问自己:“这是怎么做到的?”如果只是游走于系统使用、原理了解的层面, 是永远不可能真正理解整个系统的。很多IDE本身带有调试的功能,每当你阅读源码,陷入重围时,调试能让我们更加理解运行期的系统。如果没有调试功能,不敢想象阅读源码会怎样困难。 本章的主要目的是帮助读者构建源码学习环境,主要包括以下内容: 在Windows环境下搭建源码阅读环境; 在Linux环境下搭建基本的执行环境; Spark的基本使用,如spark-shell。 1.1 运行环境准备 考虑到大部分公司的开发和生成环境都采用Linux操作系统,所以笔者选
14、用了64位的Linux。在正式安装Spark之前,先要找台好机器。为什么?因为笔者在安装、编译、调试的过程中发现Spark非常耗 费内存,如果机器配置太低,恐怕会跑不起来。Spark的开发语言是Scala,而Scala需要运行在JVM之上,因而搭建Spark的运行环境应该包括JDK和Scala。 1.1.1 安装JDK 使用命令getconf LONG_BIT查看Linux机器是32位还是64位,然后下载相应版本的JDK并安装。 下载地址: http:/ 配置环境: cd vim .bash_profile 添加如下配置: export JAVA_HOME=/opt/java export P
15、ATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 由于笔者的机器上已经安装过openjdk,所以未使用以上方式,openjdk的安装命令如下: $ su -c “yum install java-1.7.0-openjdk“ 安装完毕后,使用javaversion命令查看,确认安装正常,如图1-1所示。 图1-1 查看安装是否正常 1.1.2 安装Scala 下载地址:http:/www.scala-lang.org/download/ 选择最新的Scala版本下
16、载,下载方法如下: wget http:/ 移动到选好的安装目录,例如: mv scala-2.11.5.tgz /install/ 进入安装目录,执行以下命令: chmod 755 scala-2.11.5.tgz tar -xzvf scala-2.11.5.tgz 配置环境: cd vim .bash_profile 添加如下配置: export SCALA_HOME=$HOME/install/scala-2.11.5 export PATH=$PATH:$SCALA_HOME/bin:$HOME/bin 安装完毕后输入scala,进入scala命令行说明scala安装正确,如图1-2
17、所示。 图1-2 进入scala命令行 1.1.3 安装Spark 下载地址:http:/spark.apache.org/downloads.html 选择最新的Spark版本下载,下载方法如下: wget http:/archive.apache.org/dist/spark/spark-1.2.0/spark-1.2.0-bin-hadoop1.tgz 移动到选好的安装目录,如: mv spark-1.2.0-bin-hadoop1.tgz/install/ 进入安装目录,执行以下命令: chmod 755 spark-1.2.0-bin-hadoop1.tgz tar -xzvf sp
18、ark-1.2.0-bin-hadoop1.tgz 配置环境: cd vim .bash_profile 添加如下配置: export SPARK_HOME=$HOME/install/spark-1.2.0-bin-hadoop1 1.2 Spark初体验 本节通过Spark的基本使用,让读者对Spark能有初步的认识,便于引导读者逐步深入学习。 1.2.1 运行spark-shell 要运行spark-shell,需要先对Spark进行配置。 1)进入Spark的conf文件夹: cd /install/spark-1.2.0-bin-hadoop1/conf 2)复制一份spark-en
19、v.sh.template,命名为spark-env.sh,对它进行编辑,命令如下: cp spark-env.sh.template spark-env.sh vim spark-env.sh 3)添加如下配置: export SPARK_MASTER_IP=127.0.0.1 export SPARK_LOCAL_IP=127.0.0.1 4)启动spark-shell: cd /install/spark-1.2.0-bin-hadoop1/bin ./spark-shell 最后我们会看到spark启动的过程,如图1-3所示。 图1-3 Spark启动过程 从以上启动日志中我们可以看到
20、SparkEnv、MapOutputTracker、BlockManagerMaster、DiskBlockManager、MemoryStore、HttpFileServer、SparkUI等信息。它们是做什么的?此处望文生义 即可,具体内容将在后边的章节详细讲解。 1.2.2 执行word count 这一节,我们通过word count这个耳熟能详的例子来感受下Spark任务的执行过程。启动spark-shell后,会打开scala命令行,然后按照以下步骤输入脚本。 1)输入val lines=sc.textFile(“http:/ 1-4所示。 图1-4 步骤1执行结果 2)输入val
21、 words=lines.flatMap(line=line.split(“),执行结果如图1-5所示。 图1-5 步骤2执行结果 3)输入val ones=words.map(w=(w,1),执行结果如图1-6所示。 图1-6 步骤3执行结果 4)输入val counts=ones.reduceByKey(_+_),执行结果如图1-7所示。 图1-7 步骤4执行结果 5)输入counts.foreach(println),任务执行过程如图1-8和图1-91所示。输出结果如图1-10所示。 图1-8 步骤5执行过程部分(一) 图1-9 步骤5执行过程部分(二) 图1-10 步骤5输出结果 在这
22、些输出日志中,我们先是看到Spark中任务的提交与执行过程,然后看到单词计数的输出结果,最后打印一些任务结束的日志信息。有关任务的执行分析,笔者将在第5章中展开。 1.2.3 剖析spark-shell 通过word count在spark-shell中执行的过程,我们想看看spark-shell做了什么。spark-shell中有以下一段脚本,见代码清单1-1。 代码清单1-1 spark-shell中的一段脚本 function main() if $cygwin; then stty -icanonmin 1 -echo /dev/null 2 then RUNNER=“$JAVA_HO
23、ME/bin/java“ else if command -v java ; then RUNNER=“java“ else echo “JAVA_HOME is not set“ shutting down SparkContext“, x) try dagScheduler.doCancelAllJobs() catch case t: Throwable = logError(“DAGScheduler failed to cancel all jobs.“, t) dagScheduler.sc.stop() Stop def receive = case p: Props = sen
24、der ! context.actorOf(p) case _ = logWarning(“received unknown message in DAGSchedulerActorSupervisor“) 代码清单3-35 DAGSchedulerEventProcessActor的实现 privatescheduler class DAGSchedulerEventProcessActor(dagScheduler: DAGS-cheduler) extends Actor with Logging override def preStart() dagScheduler.taskSche
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入 理解 Spark 核心 思想 源码 分析 html
链接地址:https://www.31doc.com/p-5518232.html