前面有提到,通常我們會在 IDE 開發 Flink,都 2023 年了應該沒人在用記事本寫 Java 了吧?至少也用個 vim。
Flink 一般來說,會有一個 master 配上幾個 slave,在啟動時當然就是看主機的 Flink 版本。例如現在最新版本是 1.17.1,你可以像前面章節一樣執行./bin/start-cluster.sh
來啟動。那在 IDE 的 pom 檔內,我們為了開發方便,也會將 flink-client 放進去,這樣 IDE 才能知道 Flink 有哪些 package 跟 class。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
裡面有一行是 <scope>provided</scope>
,這個在開發一般 Java Project 時比較少用到。這代表說這個 library 預期在執行環境會另外提供,所以在打包 jar 檔時就不會包進去。
這樣的話,一個好處是 jar 檔不會太肥,然後也不會造成版本衝突。但如果你的 client 版本跟環境差太多的話可能還是會有問題,這時候就要停機升級。
但有一個壞處,以 IntelliJ 為例,通常我都很懶惰的使用內建功能去執行:
像這張圖的左邊有一個箭頭,按下去之後 IntelliJ 會自動處理好編譯跟環境,然後以這個 main 為進入點。但是他也會配合 <scope>provided</scope>
屬性,所以不會帶入 flink 相關的 library,導致無法執行。
會看到 ClassNotFoundException
的錯誤。
為了能在本地執行來看看效果,我們要多做一件事。
在 IntelliJ 右上的 bar,應該會看到剛剛執行失敗的 java configuration,我們按 “Edit Configurations”
接下來會看到以下畫面:
點 “Modify options” ,裡面的 “Add dependencies with “provided” scope to classpath” 要打勾,然後再重新執行一次。
這次正常來說就不會看到 ClassNotFoundException
了,就看你的 Flink job 寫的成果了。