浪尖 浪尖聊大数据 java
浪尖以本身的经验讲一下为什么须要阅读源码吧!sql
a.解决企业中bug。好比flink早期bug,就不少,如json序列化工具,在开启flink仅一次处理,json格式不符合要求,就会抛异常而挂掉,而后重试,挂掉。这明显不科学,要解决这个bug就要会读源码,改源码。编程
bug代码以下:json
修改后代码以下:架构
b.丰富原有框架的需求。好比spark streaming与kafka早期版本结合,是不支持动态监听新增的topic或者分区的,而企业中kafka的topic新增分区又很常见,这时候为了丰富功能须要改源码,是的spark streaming能感知到kafka的topic和分区的变化。并发
在浪尖知识星球分享过了。框架
c.二次开发作平台。好比,浪尖最近想基于tinkerpop作知识图谱存储的框架,可是想新增一些策略,新增一个自研存储层,新增一些gremlin语法算子,那就须要你读懂源码,合理规划修改源码。jvm
d.学习。阅读源码,小了说能够学习编程语言,大了说能够学习架构设计,好比spark的rpc架构,hbase的存储层架构,sparkshuffle的分治思想及演进远离。编程语言
2.应该从何处阅读源码ide
阅读源码,到底该如何阅读呢?一个工程给你,几千,几万,甚至几十万代码;一个工程几个十几个模块,一会儿摆到你面前,确实一筹莫展,无从下手。并且Scala语法这么随性,Java后期lambda表达也很狂野,这样也让不少基础不牢或者根本没怎么作过这类编程的人,很头痛,看不懂,举步维艰。
1).算子源码阅读。
通常的计算框架,为了方便使用,都会提供多种计算算子,并且算子又分为lazy形和action形。
对于spark lazy形算子,要理解为啥是懒执行,action算子是如何触发计算的?这两个疑问都是能够经过看对应算子的源码找到答案的。
好比spark sql的逻辑组织依赖的类,如下几个:
dataset表明调用链。
dataset的函数是算子
这些类,之间如何相互做用的,弄清楚以后源码也算是阅读懂了。
对于最近作的知识图谱存储,tinkerpop也是支持这两种类型的算子。只不过调用关系比spark 更乱,源码更难阅读,由于注释也比较差,后面有机会给你们品评。
tinkerpop自身为了表述逻辑,有四层类:
traversal,相似于spark sql的dataset,表明迭代的顺序,会造成一个调用链。
step,就是traversal算子里传入的函数对象,表明计算的步骤和逻辑。
TraversalStrategy,相似于spark sql的SparkStrategy,对step算子进行优化。
单个算子看完,其实不能解决你们的疑惑,由于spark还有血缘关系,血缘关系其实就是spark 算子的调用链,以下面的:
rdd1.map(w=>(w,1)).reducebykey(_+_).take(10)
rdd之间依赖的关系分类-窄依赖和宽依赖。如何划分的,类名称叫什么?
stage划分,task划分,task包装,task调度,task执行。应该带着这些疑问去读,一个疑问一个疑问的阅读源码,揭示迷底,这样你才能透彻理解。
2).rpc源码阅读。
对于spark 的内部通信机制,浪尖以前也发过文章,大概有三种:
a.EventLoop 。如:DAGSchedulerEventProcessLoop,生产消费的阻塞队列机制。
b.sparkListener 。这是一种总线机制,spark ui的mertics都是经过这种机制获取展现的,固然task信息要经过nerry的rpc由executor端返回到driver端。
c.基于netty的RPC,task调度,任务返回等都是经过它的。
对于rpc阅读,能够进行简单了解吧,好比worker与master之间的rpc通讯消息种类,executor与driver之间的rpc通讯消息类型。
这样便于你了解,executor,driver及task的调度。
3).任务调度源码阅读。
任务调度源码阅读,主要是涵盖stage划分,task包装,driver到executor的task调度,task这行。
这里阅读的主要入口就是action算子,一步步查看调用链,而后利用eventloop+rpc+sparklistener,完成了整个task调度及结果信息返回的过程。
你读源码的时候,能够按照这几个步骤,一步步注释写文章梳理。
4).数据交互与存储源码阅读。
对于spark来讲,他的存储管理层主要是blockmanager,不管是cache,shuffle,广播变量都是考它管理的。
rpc架构,主要是mapoutputtracer及其子类。
shuffle write,就是shufflemaptask的writer操做,包括排序,聚合,文件生成,溢写磁盘。
5).高深的就是底层运行环境源码阅读。
这里你能够带的疑问:
driver和executor如何启动的。
--jars等配置是如何配置生效的。
这里面能够学到不少东西的,我也录制过视频:java知识点,包括:classloader,processbuilder等。
3.应该如何使用工具方便的阅读源码
idea是一个阅读源码并调试的好工具。
社区版本idea查看继承关系的骚操做
经验篇:Intellij IDEA 看源码必备的技能!
如何在IntelliJ IDEA优雅的查看类继承关系...
高效开发:IntelliJ IDEA每天用,这些Debug技巧你都知道?
除了好好使用idea的工具外,也能够参考浪尖源码阅读视频和文档提供的思路,而后根据本身须要阅读源码。
4.须要debug源码么
直接说,好的源码不须要debug。好比,spark源码阅读,你彻底不必debug,由于spark架构设计,代码风格清晰明了,并且注释清晰易懂,按照注释、调用连及引用关系就能够流畅阅读源码。
有些必需要debug源码,才能更好的理解。如,tinkerpop,flink源码,注释很挫,并且不少地方引用关系,隐藏太深,还有各类优化策略,还有查询及执行逻辑不慎明了,命名规范问题等使得直接阅读比较困难,须要debug,梳理调用关系链,而后才能更好阅读成长。
调试flink源码
通常状况,能够先本身顺利源码,而后debug验证本身的梳理是否正确,反之依然,两者结合,相得益彰。
最后要作到,本身关注的细节明了,运行机制明了,这样你才不会被调优困扰。
阅读源码达到最佳的境界是:深刻理解了框架的设计理念和设计细节,而且能对设计细节解决的案例场景和不适应的场景有深入的认识和理解。