这是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.7,maven 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 框架源码,敬请期待