阅读好的开源项目是最好的学习code的方法,在一个大型项目中会涉及到软件工程的方方面面。

项目代码作为最终的落地物质,其中必然会留下很多顶尖工程师、架构师、设计团队思考的痕迹;

如果从这个层面去看一个开源项目,其实至少包括三个方面:

1)这个项目是如何架构的,会用到哪些关键技术

2)实现这些设计是怎么落到code层面,利用了哪些技巧

3)利用了哪些好的库和管理的工具方法理念

学习一个开源项目可以从代码历史变更维度去追溯,项目是如何一步一步从雏形演进过来,有利于更深入去理解设计者的思路

从架构层面看开源项目:

1)包括哪些组件

2)利用了哪些外部库

3)搭建了哪些架子把组建创构起来

4)有哪些流程线让这个软件可以动起来

以上是最近阅读学习spark源码的一些思路总结;理解这个项目是为了解决什么问题,它是通过什么样解决思路去解决这个问题

当你认识清楚这个问题,知道它的难点在哪;站在解决问题的第一视角时思考该如何解决,结合你的直觉方案去思考,

去认识提出自己的解决方案和思路,然后看现成的解决方案,看别人的解决思路;刨根究底的结合源码看他们是怎么把想法

转成code,怎么去管理这个复杂项目工程时候,你会发现问题很难很复杂,但是你是可以去构着它的。

spark是为了解决数据量的计算问题,数据量大所以需要多机处理分而治之

1)多机之间如何进行数据消息传递——通过netty实现私有通讯协议

2)机器要能统一调度管理分配资源——clusterMaster集群管理、work资源上报、Application资源申请、excutor物理资源申请

3)具体计算怎么实现——内存分配管理、RDD各种操作、ShuffleStage、ResultMap、DAGSchedule构建、Taskchedule构建

4)兼容多种部署方式——deploy

5)这么多任务异常怎么处理、怎么监控——Metric、webUI、sparklistenBus

6)速度优化——kvStore、钨存储

7)更上层的应用支持——sparkSQL、Mlib、Stream、graphx、sparkPython、sparkR

这些都是静态的模块,具体的动线流程是如何,一定得要结合代码跑起来才可以更好去了解,所以我们需要去搭建spark开发工程师一样的开发环境。可以在和他们一样的环境下去开发改动这些代码,验证和测试我们的推测猜想。

spark是基于github做代码持续上线管理,通过mvn和sbt做项目依赖管理;应该是迭代开发持续上线模式,所以有很多的测试例子。我们读代码的思路:

1)看书、blog看前人是怎么讲的,方面我们对spark实现思路有个全局认识

2)结合别人源码注释按动线标注阅读代码,在心里有spark工作机理

3)结合代码的Test例子去解读每一模块是如何实现,活该如何用,推测当时实现思路

4)把某个代码模块拿出来,写自己的应用例子

5)在spark项目里面优化或者新增某些功能,然后重新编译上线,测试spark是否能够执行我们个性化定制功能

接下来就讲讲我们怎么去搭建和spark源码开发工程师一样的开发环境

A.下载源码:git clone https://github.com/apache/spark.git -b branch-2.4

B.编译源码:

./build/mvn -DskipTests clean package

C.打开IntelljIdea:File——openproject——mvn

D.等待依赖下载完,项目代码无报错标志

spark reducebykey 源码 spark源码阅读_jar

E.开始测试每个模块下的Test
F.可以把assembly/target/scala-2.11/jars里面编译好的jar包拿出来放到新工程中测试每个jar中 实现的功能,看你是否了解

G.在源码中新增功能或者优化功能,重新编译spark,部署到线上看新功能是否能够执行