![Spark大数据商业实战三部曲:内核解密、商业案例、性能调优(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/174/40375174/b_40375174.jpg)
1.3 Spark 2.4源码阅读环境搭建及源码阅读体验
对于Spark的应用,仅仅会使用其API来编程只能达到初级(助理)工程师或中级(熟练)工程师的水平,而学会调优则可以让你进阶为高级工程师。那么,怎么成为顶尖的工程师呢?源码!源码毫无保留地展示了Spark巧妙的实现原理和严谨的工作流程,同时也可能暴露出了Spark的缺陷;它不仅可以让我们深入地理解我们之前写过的代码的每一行的背后隐藏了什么,也可以让我们进一步改造Spark来更加完美地配合我们的业务。下面简单介绍一下源码阅读环境的搭建。
Spark源码是使用Scala语言编写的,这是一个基于JVM的语言,与Java有很多类似之处,在决定读源码之前需先学会Scala。
首先,准备好配置了Scala 2.11和Maven的集成开发环境(这里以IntelliJ IDEA为例),然后到Spark官网(http://spark.apache.org/downloads.html)下载并解压源码,如图1-10所示。
Spark源码安装包解压之后,打开IDEA,单击Import Project,如图1-11所示选择Maven方式,然后单击Next按钮。
出现图1-12,勾选自动导入Maven项目,自动下载Source和Documentation,在右下角的Environment settings里面选择要使用的Maven和Maven配置文件。接着单击Next按钮。
![](https://epubservercos.yuewen.com/A9A703/20964119708003506/epubprivate/OEBPS/Images/Figure-P35_3024.jpg?sign=1738951313-Uy28D9ehUu7Dbm6mOizJoF5kfJ4kF4Td-0-7f782be089810ab0955223d186d0717b)
图1-10 Spark官网下载示意图
![](https://epubservercos.yuewen.com/A9A703/20964119708003506/epubprivate/OEBPS/Images/Figure-P35_3027.jpg?sign=1738951313-23PiskU4S84aOV3AYVa2eVLgqRjmfnEC-0-dcd3ef27aa29fd0b1c243c8f935d1796)
图1-11 Maven的方式导入源码
![](https://epubservercos.yuewen.com/A9A703/20964119708003506/epubprivate/OEBPS/Images/Figure-P35_3030.jpg?sign=1738951313-kZ5M49kUIMQvT4MbKZReEEhs25dsUdh7-0-4709ad863ea279e29ad6c951444acdb3)
图1-12 Maven选项示意图
然后选择要加载的profile,根据自己的需要勾选,然后一直单击Next按钮,直到出现Finish。IEDA打开后会引入源码并解析pom文件开始下载源码需要的Jar包(建议Maven配置文件的仓库选择比较快的镜像,否则会下载很长时间)。
最后把每个源码目录下面的/src/main/里的scala文件夹选中,在右键选项里选择Mark Directory as : Sources Root,如图1-13所示。
![](https://epubservercos.yuewen.com/A9A703/20964119708003506/epubprivate/OEBPS/Images/Figure-P36_3039.jpg?sign=1738951313-AtAak4WwTz7mR801KiyuWSPKDnriCvsd-0-afee1fbd3db56efd3de74857cc8d278c)
图1-13 Mark Sources Root示意图
如果在编写程序的时候随时查看源码,可以新建一个应用程序,创建完SparkSession之后,按住Ctrl键并单击SparkSession,在右上角单击attachsources,选中源码目录即可把源码关联进来。
搭建好源码环境后,可根据我们使用Spark的步骤阅读源码。
首先,使用start-all.sh启动集群。在sbin目录下可以找到这个脚本,打开后会看到start-master.sh和start-salves.sh两个脚本,前者会引导我们进入Master类(在IDEA中双击Shift键,输入Master,打开Master.scala),Master继承自RpcEndpoint,所以直接看其onStart方法即可,接着跟踪代码就可以明白Master的启动流程。在start-salves.sh脚本里最终会引导我们进入Worker类,同样可以直接看其onStart方法。
启动完集群之后,接着提交任务。在bin目录下有一个spark-submit文件用来提交程序,这个文件会引导我们进入SparkSubmit类,我们可以直接看它伴生类里的main方法,然后可跟着代码一步一步阅读。
这里有几个重点:资源分配(Master里的schedule方法)、DAGScheduler、TaskScheduler、ScheduleBackend以及Shuffle等。