讀文檔和讀源碼的目的是不同的,就拿 Apache Flink 這個項目來講,若是你想知道 Flink 的使用功能,設計思想,實現原理,看官方文檔就足夠了;若是你想了解的就是具體細節,好比說 StreamGraph 是怎麼生成的或者是 Exactly Once 究竟如何實現的,那麼就須要去閱讀源碼了。java
關鍵是看你的目的是什麼,若是你想了解思想,經驗等看文檔就夠了,由於文檔是人寫給人的;若是你想了解具體細節,那應該去看源碼,由於源碼是人寫給機器的,源碼裏有到底作了什麼這些事情。git
那麼我寫這篇的文章目的是什麼?個人目的是,萬一你已經在生產上身經百戰了,對 Flink 的原理都把握住了,那麼看源碼是對你來講最好的進階方式,因此我爲你準備了這篇搭建環境的教程,爲你節約寶貴的時間陪家人陪孩子不香嗎?github
一般對於閱讀源碼這件事情來講是有方法論可循的。算法
這些前提知識準備好了以後,你就對這個項目有了一個感性的認識,再去閱讀它的代碼就輕鬆一些了。shell
在閱讀代碼過程當中,不是說拿到源碼就直接從第一個模塊一行行的開始讀,這樣很容易迷失方向,陷入到代碼細節中無可自拔。apache
接口抽象定義。任何項目代碼都會有不少接口,接口的繼承關係和方法,描述了它處理的數據結構,業務實體以及和其餘模塊的關係,理清楚這些關係是很是重要的。設計模式
模塊粘合層。代碼中不少的設計模式,都是爲了解耦各個模塊的,好處就是靈活擴展,壞處就是讓原本平鋪直述的代碼割裂成一個個模塊,不那麼方便閱讀。安全
業務流程。在代碼一開始,不要進入細節,一方面會打消你的積極性,一方面也看不過來。要站在必定的高度,搞清楚整個的業務流程是怎樣的,數據是怎麼被傳遞的。最好能夠畫流程圖或者時序圖,方便理解和記憶。數據結構
具體實現。在具體實現中,仍然須要弄清楚一些重要的點ssh
(1)代碼邏輯。在代碼中,有業務邏輯,是真正的業務處理邏輯;還有控制邏輯,像流程流轉之類的;
(2)出錯處理。其實不少地方都是在處理出錯的邏輯,能夠忽略掉這部分邏輯,排除干擾因素;
(3)數據處理。屬性轉換,JSON 解析,XML 解析,這些代碼都比較冗長和無聊,能夠忽略;
(4)重要的算法。這是比較核心的地方,也是最有技術含量的地方;
(5)底層交互。有一些代碼是和底層操做系統或者是和 JVM 交互的,須要知道一些底層的東西;
運行時調試。這是最直接的方式,能夠看到代碼到底是如何跑起來的,數據是怎麼樣的,是瞭解代碼最重要的方式。
總結成一句話:高屋建瓴,提綱挈領,把握方向
好了,有了這些內容心法,下面開始實戰吧!
我就不具體演示了,說一下大體流程,能夠自行百度,相關的文章不少的。
下載對應平臺(Windows,Mac)的 Git 客戶端,並安裝
下載地址:https://git-scm.com/downloads
$ git config --global user.name "Your Name" $ git config --global user.email yourEmail@example.com
ssh-keygen -t rsa
登錄 Gitee,在頭像 - 設置 - 安全設置 - SSH 公鑰 添加一個公鑰
GitHub 很慢如何下載好幾十 M 的源碼文件呢?
你想下載任意 GitHub 項目,均可以在 Gitee 上導入這個 Github 項目:
導入以後,就能夠下載了。固然 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 版本源碼就在本地了。
在導入 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>
打開 IDEA,直接打開便可,等待它下載好全部的依賴
導入後,能夠看到有不少模塊,可是各個模塊的功能見名知意,很是清晰,這裏我就不挨個介紹了。直接開始 Debug Flink-Clients 模塊。
首先想強調一下,爲何要調試這個模塊。由於這個模塊是提交 Flink 做業的入口模塊,代碼流程相對比較清晰,調試完,就能夠知道 Flink 做業是怎麼提交的了。
回憶下,大數據的 Hello,World 程序是什麼,是否是 WordCount,Flink 發行版自帶的例子中,就有 WordCount 程序。
下面的圖,我是下載了官網的 Flink-1.12 發行版,放到個人虛擬機上了。
如何把它運行起來呢?
首先啓動一個本機的 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,報錯了再說
果真,報錯以下:
說在環境變量中,沒有找到 FLINK_CONF_DIR 配置,也就是 flink 配置文件沒有找到,就是那個 flink-conf.yml 文件
這個文件實際上是在發行目錄下:
而後配置一個
在這個地方加上這個配置
FLINK_CONF_DIR=D:\Code\flink\flink\flink-dist\src\main\resources
再運行一遍,報錯以下
原來是由於,咱們以前在運行命令的時候,後面還有一坨參數,如今什麼參數都沒有往 main 方法傳,固然報錯了。
這裏咱們還須要一個 WordCount.jar 包,源碼都有了,直接從源碼打包一個出來,就是這麼的任性了。
直接把 Flink : Examples : Streaming 模塊打個包
打完包以後,在 target 目錄下,就會有一個 WordCount.jar 包了
填到這個地方
run D:\Code\flink\flink\flink-examples\flink-examples-streaming\target\WordCount.jar
而後再 Debug 看一下,發現它在這卡了好久,直到超時(WARNING 先不用管)
這個是正常的,由於它在最後生成 JobGraph 以後,是要經過 JobClient 客戶端,提交到集羣上的(還記得咱們那個配置文件嗎?裏面但是配了集羣的 JobManager 地址和端口的),而咱們在 Windows 本地並無啓動集羣。
不過沒有關係,咱們能夠經過調試代碼,看到 StreamGraph 是如何生成的,JobGraph 是如何生成的,最後是經過哪一個類準備提交到集羣的。這些提交前的動做,均可以經過源碼看獲得!
今天經過完整的下載 Flink 代碼,配置環境,初步調試了 Flink-Clients 代碼,大體清楚,一個實時做業在提交前要通過這麼多的轉換邏輯。裏面的實現細節咱們在下一次再講!你們必定要把環境裝好了!
下次見!
關注公衆號,回覆,加羣,海量資料等着你