Flink 源碼閱讀環境搭建並調試 Flink-Clients 模塊

本文大綱

image-20210128212253033

讀文檔和讀源碼的目的是不同的,就拿 Apache Flink 這個項目來講,若是你想知道 Flink 的使用功能,設計思想,實現原理,看官方文檔就足夠了;若是你想了解的就是具體細節,好比說 StreamGraph 是怎麼生成的或者是 Exactly Once 究竟如何實現的,那麼就須要去閱讀源碼了。java

關鍵是看你的目的是什麼,若是你想了解思想,經驗等看文檔就夠了,由於文檔是人寫給人的;若是你想了解具體細節,那應該去看源碼,由於源碼是人寫給機器的,源碼裏有到底作了什麼這些事情。git

那麼我寫這篇的文章目的是什麼?個人目的是,萬一你已經在生產上身經百戰了,對 Flink 的原理都把握住了,那麼看源碼是對你來講最好的進階方式,因此我爲你準備了這篇搭建環境的教程,爲你節約寶貴的時間陪家人陪孩子不香嗎?github

一般對於閱讀源碼這件事情來講是有方法論可循的。算法

一、首先得具有前提條件

  • 相關語言和基礎技術知識。好比 Java,Maven,Git,設計模式等等。若是你只會 C++,哪天心血來潮去閱讀 Flink 源碼,那是不現實的;
  • 開源項目的功能。須要知道這個項目是爲了解決什麼問題,完成什麼功能,有哪些特性,如何啓動,有哪些配置項。先把這個項目跑起來,能運行簡單的 Demo;
  • 相關的文檔。也就是龐大的工程中,有哪些模塊,每一個模塊大概的功能是幹嗎的;

這些前提知識準備好了以後,你就對這個項目有了一個感性的認識,再去閱讀它的代碼就輕鬆一些了。shell

在閱讀代碼過程當中,不是說拿到源碼就直接從第一個模塊一行行的開始讀,這樣很容易迷失方向,陷入到代碼細節中無可自拔。apache

二、其次須要關注這些重點東西

  • 接口抽象定義。任何項目代碼都會有不少接口,接口的繼承關係和方法,描述了它處理的數據結構,業務實體以及和其餘模塊的關係,理清楚這些關係是很是重要的。設計模式

  • 模塊粘合層。代碼中不少的設計模式,都是爲了解耦各個模塊的,好處就是靈活擴展,壞處就是讓原本平鋪直述的代碼割裂成一個個模塊,不那麼方便閱讀。安全

  • 業務流程。在代碼一開始,不要進入細節,一方面會打消你的積極性,一方面也看不過來。要站在必定的高度,搞清楚整個的業務流程是怎樣的,數據是怎麼被傳遞的。最好能夠畫流程圖或者時序圖,方便理解和記憶。數據結構

  • 具體實現。在具體實現中,仍然須要弄清楚一些重要的點ssh

    (1)代碼邏輯。在代碼中,有業務邏輯,是真正的業務處理邏輯;還有控制邏輯,像流程流轉之類的;

    (2)出錯處理。其實不少地方都是在處理出錯的邏輯,能夠忽略掉這部分邏輯,排除干擾因素;

    (3)數據處理。屬性轉換,JSON 解析,XML 解析,這些代碼都比較冗長和無聊,能夠忽略;

    (4)重要的算法。這是比較核心的地方,也是最有技術含量的地方;

    (5)底層交互。有一些代碼是和底層操做系統或者是和 JVM 交互的,須要知道一些底層的東西;

  • 運行時調試。這是最直接的方式,能夠看到代碼到底是如何跑起來的,數據是怎麼樣的,是瞭解代碼最重要的方式。

總結成一句話:高屋建瓴,提綱挈領,把握方向

好了,有了這些內容心法,下面開始實戰吧!

3、安裝 Git 環境

我就不具體演示了,說一下大體流程,能夠自行百度,相關的文章不少的。

一、下載 Git

下載對應平臺(Windows,Mac)的 Git 客戶端,並安裝

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

二、初始配置

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

三、生成祕鑰,並上傳到 Gitee 上

ssh-keygen -t rsa

登錄 Gitee,在頭像 - 設置 - 安全設置 - SSH 公鑰 添加一個公鑰

4、Github 龜速如何解決

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

你想下載任意 GitHub 項目,均可以在 Gitee 上導入這個 Github 項目:

image-20210128203720426

導入以後,就能夠下載了。固然 Apache Flink 活躍度前幾的項目,Gitee 確定是會同步的了,直接搜索便可。

https://gitee.com/apache/flink?_from=gitee_search

而後打開 Git Bash,克隆這個項目

git@gitee.com:apache/flink.git

獲取全部的分支

git fetch --tags

切換到 1.12.0 分支

git checkout release-1.12.0

這樣最新發布的 1.12.0 版本源碼就在本地了。

5、配置 Maven 阿里鏡像

在導入 IDEA 以前,咱們要配置 Maven 的鏡像爲阿里雲的,這樣下載 Jar 包比較快速。

在 Maven 安裝目錄的 conf 目錄的 settings.xml 文件中,加入以下配置到 mirrors 標籤中

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>       
</mirror>

6、導入 IDEA

打開 IDEA,直接打開便可,等待它下載好全部的依賴

image-20210128204304104

導入後,能夠看到有不少模塊,可是各個模塊的功能見名知意,很是清晰,這裏我就不挨個介紹了。直接開始 Debug Flink-Clients 模塊。

首先想強調一下,爲何要調試這個模塊。由於這個模塊是提交 Flink 做業的入口模塊,代碼流程相對比較清晰,調試完,就能夠知道 Flink 做業是怎麼提交的了。

一、咱們該調試哪一個對象

回憶下,大數據的 Hello,World 程序是什麼,是否是 WordCount,Flink 發行版自帶的例子中,就有 WordCount 程序。

下面的圖,我是下載了官網的 Flink-1.12 發行版,放到個人虛擬機上了。

image-20210128205037260

如何把它運行起來呢?

首先啓動一個本機的 Flink 集羣,把壓縮包解壓出來以後,什麼都不要作,直接啓動

cd /my2/flink/bin
./start-cluster.sh

提交 WordCount 程序到集羣

./flink run ../examples/streaming/WordCount.jar

這樣就直接把 WordCount 程序提交到集羣上了,是怎麼作到的呢?能夠看看 flink 這個命令裏面是什麼

vi flink

移動到最後,能夠發現

# 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 "$@"

原來它就是一個 java -classpath 類名,啓動了一個 Java 虛擬機啊

這個類就是

org.apache.flink.client.cli.CliFrontend

這個類就是咱們要運行的對象了

二、開始調試

能夠看到 CliFrontend 裏面有一個 main 方法,二話不說,直接 debug,報錯了再說

果真,報錯以下:

image-20210128205935466

說在環境變量中,沒有找到 FLINK_CONF_DIR 配置,也就是 flink 配置文件沒有找到,就是那個 flink-conf.yml 文件

這個文件實際上是在發行目錄下:

image-20210128210224362

而後配置一個

image-20210128210014939

在這個地方加上這個配置

image-20210128210347255

FLINK_CONF_DIR=D:\Code\flink\flink\flink-dist\src\main\resources

再運行一遍,報錯以下

image-20210128210556202

原來是由於,咱們以前在運行命令的時候,後面還有一坨參數,如今什麼參數都沒有往 main 方法傳,固然報錯了。

這裏咱們還須要一個 WordCount.jar 包,源碼都有了,直接從源碼打包一個出來,就是這麼的任性了。

直接把 Flink : Examples : Streaming 模塊打個包

image-20210128210953760

打完包以後,在 target 目錄下,就會有一個 WordCount.jar 包了

image-20210128211119597

image-20210128211106895

填到這個地方

run D:\Code\flink\flink\flink-examples\flink-examples-streaming\target\WordCount.jar

image-20210128211203647

而後再 Debug 看一下,發現它在這卡了好久,直到超時(WARNING 先不用管)

image-20210128211400312

這個是正常的,由於它在最後生成 JobGraph 以後,是要經過 JobClient 客戶端,提交到集羣上的(還記得咱們那個配置文件嗎?裏面但是配了集羣的 JobManager 地址和端口的),而咱們在 Windows 本地並無啓動集羣。

不過沒有關係,咱們能夠經過調試代碼,看到 StreamGraph 是如何生成的,JobGraph 是如何生成的,最後是經過哪一個類準備提交到集羣的。這些提交前的動做,均可以經過源碼看獲得!

7、總結

今天經過完整的下載 Flink 代碼,配置環境,初步調試了 Flink-Clients 代碼,大體清楚,一個實時做業在提交前要通過這麼多的轉換邏輯。裏面的實現細節咱們在下一次再講!你們必定要把環境裝好了!

下次見!

關注公衆號,回覆,加羣,海量資料等着你

image-20210128213814425

相關文章
相關標籤/搜索