iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

前面有提到,通常我們會在 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 為例,通常我都很懶惰的使用內建功能去執行:

Untitled

像這張圖的左邊有一個箭頭,按下去之後 IntelliJ 會自動處理好編譯跟環境,然後以這個 main 為進入點。但是他也會配合 <scope>provided</scope> 屬性,所以不會帶入 flink 相關的 library,導致無法執行。

Untitled

會看到 ClassNotFoundException 的錯誤。

為了能在本地執行來看看效果,我們要多做一件事。

在 IntelliJ 右上的 bar,應該會看到剛剛執行失敗的 java configuration,我們按 “Edit Configurations

Untitled

接下來會看到以下畫面:

Untitled

點 “Modify options” ,裡面的 “Add dependencies with “provided” scope to classpath” 要打勾,然後再重新執行一次。

這次正常來說就不會看到 ClassNotFoundException 了,就看你的 Flink job 寫的成果了。


上一篇
Flink 的單元測試 20 - Day25
下一篇
Airflow 的 XCom 與限制 - Day27
系列文
用 Airflow & Flink 來開發 ETL 吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言