如何阅读源码,这一篇应该够了

2019-08-14 15:48:47 浏览数 (1)

这是kk第005篇文章

今晚的星星很亮,但我知道你没有在抬头望。

仔细想想,这真是星星的损失。

哈哈,刚发生了什么?光速回到正题(一本正经脸!)

很多人一定和我一样的感受:源码在工作中有用吗?用处大吗?很长一段时间,我也有这样的疑问,认为那些有事没事扯源码的人,就是在装,只是为了提高他们的逼格而已。

那为什么还要读源码呢?

其实从源码中,可以学到很多东西。

学习别人高效的代码书写,学习别人对设计模式的熟练使用,学习别人对整个架构的布局,学习别人在实现某类功能使用到的数据结构和算法,等等。

所谓高手,其实就是能比大部分人更早更快的掌握套路并熟练运用之人。

那么该怎样阅读源码呢?

首先要精心挑选源码项目。最好与你的编程语言、你的工作内容、你的兴趣相关的,这样才能切实的感受到阅读源码给你带来的益处,更加有动力继续下去。

选好阅读项目后,要了解项目中的各个组件以及其运行原理。否则直接跳进源码中,可能一层层的深不见底,很快你就会迷失方向,产生挫败感,进而放弃。要选择一快内容,有针对性的,带着问题去阅读。

能够编译运行起来。如果一份代码只能看不能跑,只能去猜测这里的数据值和数据结构,而很有可能你猜的是错的。

但如果你能编译运行,可以在你需要的时候,加上日志等方式来更好的观察和验证你的想法。

要做一些笔记。一方面是将你的学习成果,整理归纳,方便随时查阅,毕竟只凭脑子记不是很靠谱,会遗忘;另一方面,在学习的过程中,可以帮助你理解,遇到不懂的没关系,可以先记下来,后面等知识储备上来,再回来看,就会豁然开朗了。

说了这么多,不实战一下,岂不是空谈?

众所周知,Spark 是一个非常优秀的开源项目,它是一个基于内存的开源计算框架,提供了基于 SQL 和 DataFrame 的结构化数据处理、流式数据处理、机器学习和计算等多方面的功能,提供了多种语言的 API,是目前大数据分析和数据科学应用的事实标准。

其源码质量也是非常优秀,它使用 Java 来开发底层的基础设施和中间件,使用 Scala 来开发Spark 内核,代码量很少并且非常精简。阅读起来会让你惊艳。

这里我们选择 Spark 2.1.0 版本作为源码阅读的版本。

下面,我们使用 idea 安装本地调试环境。

1、从spark官网上下载spark源码

https://archive.apache.org/dist/spark/spark-2.1.0/

选择tgz文件下载

下载完成后解压到D盘根目录下

2、编译源码前的准备工作

编译spark 2.1.0 源码要求 jdk1.7maven 3.3.9 scala 2.11.8 版本

务必先安装好这三个组件,配置好环境变量,这里不重复说明安装方式

安装 git bash

https://gitforwindows.org/

从这个地址下载一路安装好即可

下载编译源码必须的工具zinc(0.3.9)版本和scala(2.11.8)版本(目的是减少自动下载这两个组件的时间)

(后台公众号回复:spark,获得免费百度网盘下载链接)

获得zinc和scala后,解压到源码根目录的build目录下

如上图所示

3、开始编译

在环境变量中配置一个参数,否则会导致编译过程中内存溢出

MAVEN_OPTS

-Xmx2g -XX:ReservedCodeCacheSize=512m

打开git bash,cd 到源码根目录下,运行:

./build/mvn -DskipTests clean package

等待15分钟,即可编译完成

4、导入到idea中

idea 版本 2019.2

接下来一路Next即可

右下角,这里不用点

5、找到examples模块的JavaWordCount源码,右键运行

问题1:报错如下:

由于我们的 idea 是 2019.2 版本,默认使用 jdk 8,所以需要把当前环境设置为 jdk 8

File -> Project Structure

这里选择1.8

继续运行,等待scalac编译完成

问题2:

这个类找不到

解决:

右键:Generate Sources and Update Folders

问题3:

解决:

Idea 默认是不加载 Provided 依赖的

最后,配置好参数执行:

最后执行成功

SparkConf 源码阅读

使用Utils.getSystemProperties 获取系统属性,并使用scala守卫过滤出其中以 "spark."字符串为前缀的key 和 value

并且调用 set 方法,最终设置到 settings 中。

其中 settings 是一个 ConcurrentHashMap

使用 SparkConf 配置的 API

有些 API 最终实际调用了 set 方法

下一篇,剖析 Spark 内置 RPC 框架源码,敬请期待

0 人点赞