阅读大数据组件源码的进化之路
自嘲
以前觉得阅读源码是多么牛掰的事,曾经也心动的想去看,于是就兴冲冲地去上网百度怎么看源码,没有找到适合自己的,也关键是自己没有坚持吧,然后就没有然后了(要是有捂脸表情包就好了,此处省略一百个!)。最近因工作需要,也开始看了。本文仅本人阅读源码过程对应该怎么看的一些想法,打算把自己看源码的方法方式总结出来,经常反省,希望能记录自己如何从一个新手慢慢蜕变的过程,也许从新手变为了新新手了(捂脸!!!)。
以下方法仅是个人根据和人交流、自己阅读一段时间后的反省所总结的,不喜勿喷,欢迎留言大家交流。
阶段一:(总结于2019.07.12)
1、源码准备
现在好像绝大多数的大数据组件的源码都是可以从GitHub上下载的。怎么找到了?简单,百度如“Flink github”即可,然后下载对应版本即可。版本如何选择了?个人建议还是选择手里已有环境的版本,如公司里面装的Kafka 1.1.0的,为了方便自己验证,阅读的源码版本最好也是1.1.0。
下载好了,如何阅读了?现在很多大数据组件的源码都是maven构建,只要导入到IDEA或Eclipse就行啦,其过程就是导入maven程序,如何导入,可以百度“导入maven工程”之类的就行,后期我也会以一个组件为例专门写一篇博客的。这里大伙不要觉得简单,当然是也是不难,但是对刚接触的人来说其实还是要花一定功夫的。导入之后,就会发现组件的源码是分为多个模块的,可以对应的阅读,当然,建议是多看看使用的example。那现在阅读环境都搞定了,是不是开始撸起袖子投入到源码中了?个人以为不是!
2、知识准备
成千上万行代码,突然一头扎进去,很可能会出不来,最后看的一头雾水,以黯然收场。常见的情况时,这行代码,我懂了,这个函数实现的功能我懂了,然后这个函数用来干嘛了?一脸懵啊!博主就是经历过这样痛苦的过程,一天了,什么都懂,什么都不懂,很痛苦的!
怎么办了?个人建议,先买一本或者官网或者介绍原理的博客多看看,多对比,懂整个过程,比如在Flink中,客户端的请求先发给谁,然后又怎么和集群交互上等等一套流程要烂熟于心,用大师的话说,就是创建心里表征(最近看《刻意练习》这本书拿来的词)。因为代码是用来实现的,我们最好得明白需要实现什么。
3、阅读功能的流程性
看源码很容易陷入细节出不来,所以,我的心得就是阅读过程,懂得哪一步实现了功能中的那个点,然后将整个过程串起来,一个过程的整体流程。比如,kafka,生产者如何发送消息给broker,这个是不是应该得构建消息体、分配好对应的分区、找到对应的broker、消息发送等等一系列的事情。我们可以先不纠结与细节,如消息体是怎么构建的,包含什么信息等等具体的,先把整个流程走通,收获小小的满足感了再说。
4、功能的实现
把整个过程的流程走通,肯定不是结束了,我们其实想弄明白,这个功能是怎么实现的,这个时候就得针对特定的模块深入的去看了。这个时候,我个人的经验是,先看整体的代码结构,比如if...else条件,先看判断条件中对应的实际意义,然后深入语句块看看这个实际意义是怎么实现的。这个过程也是先整体后细节。
5、问题排查
看源码的一个主要原因是想解决实际的生产问题,也就是说,报错了,我们根据整体流程,找到是哪一块出问题了,然后找到对应的块,分析原因,推到引起的可能因素,最后找到对应的改进点,比如参数的优化,代码的改进等。
6、代码的阅读
一般学习型的阅读源码,过程就是2->3->4->5;解决问题的阅读则是2->5->(3)->4。由此可以看出,学习源码都是得了解相关的知识以后才能看的。
针对学习型的阅读源码,可以采取的方式是,写一个简单的demo,然后debug跟进去阅读;针对解决问题型,则是根据报错的提示信息,如类名,报错码,去组件源码中对应的模块去搜索,然后找到报错的可能因素,结合集群环境的去分析。
总结:
阅读源码既是一个水滴石穿的慢工,也是一个讲究方法的过程。目前,博主才看多一段时间,还需更多实践,以后会将阅读方法的改进过程,也发布出来,希望大伙多多交流!
阶段二:更新于(2019-08-30)
这一段时间以来,秉着先懂知识点,再框架流程的,最后细节结合功能的理念,在学习Flink源码,有了点小心得就记下来,希望慢慢总结出自己的风格。
使用大数据组件能帮我们极大简化在大数据处理过程的问题,但也存在一定的缺点,就是我们无法像自己写的代码那样,迅速地从报的错误定位到问题所在。这也就要求我们从熟悉API的使用到熟悉数据的处理过程,也就是阅读源码熟悉整体过程。
在阅读Flink源码,弄清楚我们在任务提交过程中Flink做了什么,可以从其命令脚本入手,分析环境、配置参数等加载过程,从脚本中看出来调用的函数的main方法,并以此为入口去Flink源码中分析任务的提交过程。这里有两个小心得:
1)可以结合提交任务时控制台输出的日志去阅读源码;
2)可以根据main函数的传参,通过配置相关参数,在本地编译器如IDEA中进行debug分析过程。
其实不管是Flink任务的提交还是Flink集群的启动,要弄清楚其过程,都可以从对应的命令脚本入手,找到其对应的主函数,结合输出日志和debug去分析。
总结:
个人觉得学习源码或者一个东西的过程就是明白从框架原理(具有什么特性、整体过程)->实现(包括整体、细节)->设计理念(这样设计的原因和好处)的一个过程。
阶段三:更新于(2019-10-30)
分析源码处了从原理着手之后,借助大牛分析原理和源码的博客,是一个快速源码方法