前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何阅读源码,这一篇应该够了

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

作者头像
kk大数据
发布2019-08-14 15:48:47
5280
发布2019-08-14 15:48:47
举报
文章被收录于专栏:kk大数据kk大数据

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 KK架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档