手把手教你閱讀Flink 源碼
本文大綱

一、Flink 官方文檔這么全面,為什么還要讀 Flink 源碼
二、Flink 源碼幾百萬(wàn)行,該如何下手
通常對(duì)于閱讀源碼這件事情來(lái)說(shuō)是有方法論可循的。
1、首先得具備前提條件
相關(guān)語(yǔ)言和基礎(chǔ)技術(shù)知識(shí)。比如 Java,Maven,Git,設(shè)計(jì)模式等等。如果你只會(huì) C++,哪天心血來(lái)潮去閱讀 Flink 源碼,那是不現(xiàn)實(shí)的;
開源項(xiàng)目的功能。需要知道這個(gè)項(xiàng)目是為了解決什么問題,完成什么功能,有哪些特性,如何啟動(dòng),有哪些配置項(xiàng)。先把這個(gè)項(xiàng)目跑起來(lái),能運(yùn)行簡(jiǎn)單的 Demo;
相關(guān)的文檔。也就是龐大的工程中,有哪些模塊,每個(gè)模塊大概的功能是干嘛的;
2、其次需要關(guān)注這些重點(diǎn)東西
接口抽象定義。任何項(xiàng)目代碼都會(huì)有很多接口,接口的繼承關(guān)系和方法,描述了它處理的數(shù)據(jù)結(jié)構(gòu),業(yè)務(wù)實(shí)體以及和其他模塊的關(guān)系,理清楚這些關(guān)系是非常重要的。
模塊粘合層。代碼中很多的設(shè)計(jì)模式,都是為了解耦各個(gè)模塊的,好處就是靈活擴(kuò)展,壞處就是讓本來(lái)平鋪直述的代碼割裂成一個(gè)個(gè)模塊,不那么方便閱讀。
業(yè)務(wù)流程。在代碼一開始,不要進(jìn)入細(xì)節(jié),一方面會(huì)打消你的積極性,一方面也看不過來(lái)。要站在一定的高度,搞清楚整個(gè)的業(yè)務(wù)流程是怎樣的,數(shù)據(jù)是怎么被傳遞的。最好可以畫流程圖或者時(shí)序圖,方便理解和記憶。
具體實(shí)現(xiàn)。在具體實(shí)現(xiàn)中,仍然需要弄清楚一些重要的點(diǎn)
(1)代碼邏輯。在代碼中,有業(yè)務(wù)邏輯,是真正的業(yè)務(wù)處理邏輯;還有控制邏輯,像流程流轉(zhuǎn)之類的;
(2)出錯(cuò)處理。其實(shí)很多地方都是在處理出錯(cuò)的邏輯,可以忽略掉這部分邏輯,排除干擾因素;
(3)數(shù)據(jù)處理。屬性轉(zhuǎn)換,JSON 解析,XML 解析,這些代碼都比較冗長(zhǎng)和無(wú)聊,可以忽略;
(4)重要的算法。這是比較核心的地方,也是最有技術(shù)含量的地方;
(5)底層交互。有一些代碼是和底層操作系統(tǒng)或者是和 JVM 交互的,需要知道一些底層的東西;
運(yùn)行時(shí)調(diào)試。這是最直接的方式,可以看到代碼究竟是如何跑起來(lái)的,數(shù)據(jù)是怎么樣的,是了解代碼最重要的方式。
總結(jié)成一句話:高屋建瓴,提綱挈領(lǐng),把握方向
三、安裝 Git 環(huán)境
我就不具體演示了,說(shuō)一下大致流程,可以自行百度,相關(guān)的文章很多的。
1、下載 Git
下載對(duì)應(yīng)平臺(tái)(Windows,Mac)的 Git 客戶端,并安裝
下載地址:https://git-scm.com/downloads
2、初始配置
$?git?config?--global?user.name?"Your?Name"
$[email protected]
3、生成秘鑰,并上傳到 Gitee 上
ssh-keygen?-t?rsa
登陸 Gitee,在頭像 - 設(shè)置 - 安全設(shè)置 - SSH 公鑰 添加一個(gè)公鑰
四、Github 龜速如何解決
GitHub 很慢如何下載好幾十 M 的源碼文件呢?
你想下載任意 GitHub 項(xiàng)目,都可以在 Gitee 上導(dǎo)入這個(gè) Github 項(xiàng)目:

導(dǎo)入之后,就可以下載了。當(dāng)然 Apache Flink 活躍度前幾的項(xiàng)目,Gitee 肯定是會(huì)同步的了,直接搜索即可。
https://gitee.com/apache/flink?_from=gitee_search
然后打開 Git Bash,克隆這個(gè)項(xiàng)目
[email protected]:apache/flink.git
獲取所有的分支
git?fetch?--tags
切換到 1.12.0 分支
git?checkout?release-1.12.0
這樣最新發(fā)布的 1.12.0 版本源碼就在本地了。
五、配置 Maven 阿里鏡像
在導(dǎo)入 IDEA 之前,我們要配置 Maven 的鏡像為阿里云的,這樣下載 Jar 包比較快速。
在 Maven 安裝目錄的 conf 目錄的 settings.xml 文件中,加入如下配置到 mirrors 標(biāo)簽中
<mirror>
????<id>alimavenid>
????<name>aliyun?mavenname>
????<url>http://maven.aliyun.com/nexus/content/groups/public/url>
????<mirrorOf>centralmirrorOf>???????
mirror>
六、導(dǎo)入 IDEA
打開 IDEA,直接打開即可,等待它下載好所有的依賴

導(dǎo)入后,可以看到有很多模塊,但是各個(gè)模塊的功能見名知意,非常清晰,這里我就不挨個(gè)介紹了。直接開始 Debug Flink-Clients 模塊。
七、開始調(diào)試 Flink-Clients
首先想強(qiáng)調(diào)一下,為什么要調(diào)試這個(gè)模塊。因?yàn)檫@個(gè)模塊是提交 Flink 作業(yè)的入口模塊,代碼流程相對(duì)比較清晰,調(diào)試完,就可以知道 Flink 作業(yè)是怎么提交的了。
1、我們?cè)撜{(diào)試哪個(gè)對(duì)象
回憶下,大數(shù)據(jù)的 Hello,World 程序是什么,是不是 WordCount,F(xiàn)link 發(fā)行版自帶的例子中,就有 WordCount 程序。
下面的圖,我是下載了官網(wǎng)的 Flink-1.12 發(fā)行版,放到我的虛擬機(jī)上了。

如何把它運(yùn)行起來(lái)呢?
首先啟動(dòng)一個(gè)本機(jī)的 Flink 集群,把壓縮包解壓出來(lái)之后,什么都不要做,直接啟動(dòng)
cd?/my2/flink/bin
./start-cluster.sh
提交 WordCount 程序到集群
./flink?run?../examples/streaming/WordCount.jar
這樣就直接把 WordCount 程序提交到集群上了,是怎么做到的呢?可以看看 flink 這個(gè)命令里面是什么
vi?flink
移動(dòng)到最后,可以發(fā)現(xiàn)
#?Add?HADOOP_CLASSPATH?to?allow?the?usage?of?Hadoop?file?systems
exec?$JAVA_RUN?$JVM_ARGS?$FLINK_ENV_JAVA_OPTS?"${log_setting[@]}"?-classpath?"`manglePathList?"$CC_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`"?org.apache.flink.client.cli.CliFrontend?"$@"
原來(lái)它就是一個(gè) java -classpath 類名,啟動(dòng)了一個(gè) Java 虛擬機(jī)啊
這個(gè)類就是
org.apache.flink.client.cli.CliFrontend
這個(gè)類就是我們要運(yùn)行的對(duì)象了
2、開始調(diào)試
可以看到 CliFrontend 里面有一個(gè) main 方法,二話不說(shuō),直接 debug,報(bào)錯(cuò)了再說(shuō)
果然,報(bào)錯(cuò)如下:

說(shuō)在環(huán)境變量中,沒有找到 FLINK_CONF_DIR 配置,也就是 flink 配置文件沒有找到,就是那個(gè) flink-conf.yml 文件
這個(gè)文件其實(shí)是在發(fā)行目錄下:

然后配置一個(gè)

在這個(gè)地方加上這個(gè)配置

FLINK_CONF_DIR=D:\Code\flink\flink\flink-dist\src\main\resources
再運(yùn)行一遍,報(bào)錯(cuò)如下

原來(lái)是因?yàn)椋覀冎霸谶\(yùn)行命令的時(shí)候,后面還有一坨參數(shù),現(xiàn)在什么參數(shù)都沒有往 main 方法傳,當(dāng)然報(bào)錯(cuò)了。
這里我們還需要一個(gè) WordCount.jar 包,源碼都有了,直接從源碼打包一個(gè)出來(lái),就是這么的任性了。
直接把 Flink : Examples : Streaming 模塊打個(gè)包

打完包之后,在 target 目錄下,就會(huì)有一個(gè) WordCount.jar 包了


填到這個(gè)地方
run?D:\Code\flink\flink\flink-examples\flink-examples-streaming\target\WordCount.jar

然后再 Debug 看一下,發(fā)現(xiàn)它在這卡了很久,直到超時(shí)(WARNING 先不用管)

這個(gè)是正常的,因?yàn)樗谧詈笊?JobGraph 之后,是要通過 JobClient 客戶端,提交到集群上的(還記得我們那個(gè)配置文件嗎?里面可是配了集群的 JobManager 地址和端口的),而我們?cè)?Windows 本地并沒有啟動(dòng)集群。
不過沒有關(guān)系,我們可以通過調(diào)試代碼,看到 StreamGraph 是如何生成的,JobGraph 是如何生成的,最后是通過哪個(gè)類準(zhǔn)備提交到集群的。這些提交前的動(dòng)作,都可以通過源碼看得到!
七、總結(jié)
今天通過完整的下載 Flink 代碼,配置環(huán)境,初步調(diào)試了 Flink-Clients 代碼,大致清楚,一個(gè)實(shí)時(shí)作業(yè)在提交前要經(jīng)過這么多的轉(zhuǎn)換邏輯。里面的實(shí)現(xiàn)細(xì)節(jié)我們?cè)谙乱淮卧僦v!大家一定要把環(huán)境裝好了!
下次見!
--end--
原創(chuàng)專輯:
技術(shù)漫畫與職場(chǎng)經(jīng)驗(yàn)
掃描下方二維碼 添加好友,備注【交流】 可私聊交流,也可進(jìn)資源豐富學(xué)習(xí)群
更文不易,點(diǎn)個(gè)“在看”支持一下??
