Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

本文大綱

image.png

一、Flink 官方文檔這么全面,為什么還要讀 Flink 源碼

讀文檔和讀源碼的目的是不一樣的逢勾,就拿 Apache Flink 這個(gè)項(xiàng)目來(lái)說(shuō)扰柠,如果你想知道 Flink 的使用功能粉铐,設(shè)計(jì)思想,實(shí)現(xiàn)原理卤档,看官方文檔就足夠了蝙泼;如果你想了解的就是具體細(xì)節(jié),比如說(shuō) StreamGraph 是怎么生成的或者是 Exactly Once 究竟如何實(shí)現(xiàn)的劝枣,那么就需要去閱讀源碼了踱承。

關(guān)鍵是看你的目的是什么,如果你想了解思想哨免,經(jīng)驗(yàn)等看文檔就夠了茎活,因?yàn)槲臋n是人寫(xiě)給人的;如果你想了解具體細(xì)節(jié)琢唾,那應(yīng)該去看源碼载荔,因?yàn)樵创a是人寫(xiě)給機(jī)器的,源碼里有到底做了什么這些事情采桃。

那么我寫(xiě)這篇的文章目的是什么懒熙?我的目的是,萬(wàn)一你已經(jīng)在生產(chǎn)上身經(jīng)百戰(zhàn)了普办,對(duì) Flink 的原理都把握住了工扎,那么看源碼是對(duì)你來(lái)說(shuō)最好的進(jìn)階方式,所以我為你準(zhǔn)備了這篇搭建環(huán)境的教程衔蹲,為你節(jié)約寶貴的時(shí)間陪家人陪孩子不香嗎肢娘?

二、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í)的蟋定;
  • 開(kāi)源項(xiàng)目的功能。需要知道這個(gè)項(xiàng)目是為了解決什么問(wèn)題垢夹,完成什么功能溢吻,有哪些特性,如何啟動(dòng)果元,有哪些配置項(xiàng)促王。先把這個(gè)項(xiàng)目跑起來(lái),能運(yùn)行簡(jiǎn)單的 Demo而晒;
  • 相關(guān)的文檔蝇狼。也就是龐大的工程中,有哪些模塊倡怎,每個(gè)模塊大概的功能是干嘛的迅耘;

這些前提知識(shí)準(zhǔn)備好了之后,你就對(duì)這個(gè)項(xiàng)目有了一個(gè)感性的認(rèn)識(shí)监署,再去閱讀它的代碼就輕松一些了颤专。

在閱讀代碼過(guò)程中,不是說(shuō)拿到源碼就直接從第一個(gè)模塊一行行的開(kāi)始讀钠乏,這樣很容易迷失方向栖秕,陷入到代碼細(xì)節(jié)中無(wú)可自拔。

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ù)流程么鹤。在代碼一開(kāi)始,不要進(jìn)入細(xì)節(jié)味廊,一方面會(huì)打消你的積極性蒸甜,一方面也看不過(guò)來(lái)。要站在一定的高度余佛,搞清楚整個(gè)的業(yè)務(wù)流程是怎樣的柠新,數(shù)據(jù)是怎么被傳遞的。最好可以畫(huà)流程圖或者時(shí)序圖辉巡,方便理解和記憶恨憎。
  • 具體實(shí)現(xiàn)。在具體實(shí)現(xiàn)中,仍然需要弄清楚一些重要的點(diǎn)(1)代碼邏輯憔恳。在代碼中瓤荔,有業(yè)務(wù)邏輯,是真正的業(yè)務(wù)處理邏輯钥组;還有控制邏輯输硝,像流程流轉(zhuǎn)之類(lèi)的;(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é)成一句話(huà):高屋建瓴箱靴,提綱挈領(lǐng)腺逛,把握方向

好了,有了這些內(nèi)容心法衡怀,下面開(kāi)始實(shí)戰(zhàn)吧棍矛!

三、安裝 Git 環(huán)境

我就不具體演示了抛杨,說(shuō)一下大致流程够委,可以自行百度,相關(guān)的文章很多的怖现。

1茁帽、下載 Git

下載對(duì)應(yīng)平臺(tái)(Windows,Mac)的 Git 客戶(hù)端,并安裝

下載地址: https://git-scm.com/downloads

2潘拨、初始配置

$ git config --global user.name "Your Name"
$ git config --global user.email yourEmail@example.com

3吊输、生成秘鑰,并上傳到 Gitee 上

ssh-keygen -t rsa

登陸 Gitee战秋,在頭像 - 設(shè)置 - 安全設(shè)置 - SSH 公鑰 添加一個(gè)公鑰

四璧亚、Github 龜速如何解決

GitHub 很慢如何下載好幾十 M 的源碼文件呢讨韭?

你想下載任意 GitHub 項(xiàng)目脂信,都可以在 Gitee 上導(dǎo)入這個(gè) Github 項(xiàng)目:

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

導(dǎo)入之后,就可以下載了透硝。當(dāng)然 Apache Flink 活躍度前幾的項(xiàng)目狰闪,Gitee 肯定是會(huì)同步的了,直接搜索即可濒生。

https://gitee.com/apache/flin...

然后打開(kāi) Git Bash埋泵,克隆這個(gè)項(xiàng)目

git@gitee.com: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>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>       
</mirror>

六、導(dǎo)入 IDEA

打開(kāi) IDEA晒骇,直接打開(kāi)即可霉撵,等待它下載好所有的依賴(lài)

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

導(dǎo)入后,可以看到有很多模塊洪囤,但是各個(gè)模塊的功能見(jiàn)名知意徒坡,非常清晰,這里我就不挨個(gè)介紹了瘤缩。直接開(kāi)始 Debug Flink-Clients 模塊喇完。

七、開(kāi)始調(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ī)上了。

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

如何把它運(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 類(lèi)名供炼,啟動(dòng)了一個(gè) Java 虛擬機(jī)啊

這個(gè)類(lèi)就是

org.apache.flink.client.cli.CliFrontend

這個(gè)類(lèi)就是我們要運(yùn)行的對(duì)象了

2、開(kāi)始調(diào)試

可以看到 CliFrontend 里面有一個(gè) main 方法窘疮,二話(huà)不說(shuō)袋哼,直接 debug,報(bào)錯(cuò)了再說(shuō)

果然闸衫,報(bào)錯(cuò)如下:

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

說(shuō)在環(huán)境變量中涛贯,沒(méi)有找到 FLINK_CONF_DIR 配置,也就是 flink 配置文件沒(méi)有找到楚堤,就是那個(gè) flink-conf.yml 文件

這個(gè)文件其實(shí)是在發(fā)行目錄下:

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

然后配置一個(gè)

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

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

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊
FLINK_CONF_DIR=D:\Code\flink\flink\flink-dist\src\main\resources

再運(yùn)行一遍疫蔓,報(bào)錯(cuò)如下

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

原來(lái)是因?yàn)椋覀冎霸谶\(yùn)行命令的時(shí)候身冬,后面還有一坨參數(shù)衅胀,現(xiàn)在什么參數(shù)都沒(méi)有往 main 方法傳,當(dāng)然報(bào)錯(cuò)了酥筝。

這里我們還需要一個(gè) WordCount.jar 包滚躯,源碼都有了,直接從源碼打包一個(gè)出來(lái)嘿歌,就是這么的任性了掸掏。

直接把 Flink : Examples : Streaming 模塊打個(gè)包

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

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

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

填到這個(gè)地方

run D:\Code\flink\flink\flink-examples\flink-examples-streaming\target\WordCount.jar
Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

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

Flink源碼閱讀環(huán)境搭建并調(diào)試FlinkClients模塊

這個(gè)是正常的步脓,因?yàn)樗谧詈笊?JobGraph 之后愿待,是要通過(guò) JobClient 客戶(hù)端浩螺,提交到集群上的(還記得我們那個(gè)配置文件嗎?里面可是配了集群的 JobManager 地址和端口的)仍侥,而我們?cè)?Windows 本地并沒(méi)有啟動(dòng)集群要出。

不過(guò)沒(méi)有關(guān)系,我們可以通過(guò)調(diào)試代碼农渊,看到 StreamGraph 是如何生成的患蹂,JobGraph 是如何生成的,最后是通過(guò)哪個(gè)類(lèi)準(zhǔn)備提交到集群的砸紊。這些提交前的動(dòng)作传于,都可以通過(guò)源碼看得到!

七批糟、總結(jié)

今天通過(guò)完整的下載 Flink 代碼格了,配置環(huán)境看铆,初步調(diào)試了 Flink-Clients 代碼徽鼎,大致清楚,一個(gè)實(shí)時(shí)作業(yè)在提交前要經(jīng)過(guò)這么多的轉(zhuǎn)換邏輯弹惦。里面的實(shí)現(xiàn)細(xì)節(jié)我們?cè)谙乱淮卧僦v否淤!大家一定要把環(huán)境裝好了!

來(lái)源:https://www.tuicool.com/articles/vUJrey3

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棠隐,一起剝皮案震驚了整個(gè)濱河市石抡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌助泽,老刑警劉巖啰扛,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嗡贺,居然都是意外死亡隐解,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)诫睬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)煞茫,“玉大人,你說(shuō)我怎么就攤上這事摄凡⌒眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵亲澡,是天一觀的道長(zhǎng)钦扭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)床绪,這世上最難降的妖魔是什么客情? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任捎琐,我火速辦了婚禮,結(jié)果婚禮上裹匙,老公的妹妹穿的比我還像新娘瑞凑。我一直安慰自己,他們只是感情好概页,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布籽御。 她就那樣靜靜地躺著,像睡著了一般惰匙。 火紅的嫁衣襯著肌膚如雪技掏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天项鬼,我揣著相機(jī)與錄音哑梳,去河邊找鬼。 笑死绘盟,一個(gè)胖子當(dāng)著我的面吹牛鸠真,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播龄毡,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吠卷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了沦零?” 一聲冷哼從身側(cè)響起祭隔,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎路操,沒(méi)想到半個(gè)月后疾渴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屯仗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年搞坝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祭钉。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞄沙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慌核,到底是詐尸還是另有隱情距境,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布垮卓,位于F島的核電站垫桂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏粟按。R本人自食惡果不足惜诬滩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一霹粥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疼鸟,春花似錦后控、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吴攒,卻和暖如春张抄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洼怔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工署惯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镣隶。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓极谊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親矾缓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怀酷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容