1. 程式人生 > >《從0到1學習Flink》—— 你上傳的 jar 包藏到哪裡去了?

《從0到1學習Flink》—— 你上傳的 jar 包藏到哪裡去了?

開發十年,就只剩下這套架構體系了! >>>   

前言

寫這篇文章其實也是知識星球裡面的一個小夥伴問了這樣一個問題:

通過 flink UI 儀表盤提交的 jar 是儲存在哪個目錄下?

這個問題其實我自己也有問過,但是自己因為自己的問題沒有啥壓力也就沒深入去思考,現在可是知識星球的付費小夥伴問的,所以自然要逼著自己去深入然後才能給出正確的答案。

跟著我一起來看看我的探尋步驟吧!小小的 jar 竟然還敢和我捉迷藏?

檢視配置檔案

首先想到的是這個肯定可以在配置檔案中有設定的地方的:

谷歌大法好

雖然有個是 upload 的,但是並不是我們想要的目錄!於是,只好動用我的“谷歌大法好”。

找到了一條,點進去看 Issue 如下:

發現這 tm 不就是想要的嗎?都支援配置檔案來填寫上傳的 jar 後儲存的目錄了!趕緊點進去看一波原始碼:

原始碼確認

這個 jobmanager.web.upload.dir 是不是?我去看下 1.8 的原始碼確認一下:

發現這個 jobmanager.web.upload.dir 還過期了,用 WebOptions

 類中的 UPLOAD_DIR 替代了!

繼續跟進去看看這個 UPLOAD_DIR 是啥玩意?

看這注釋的意思是說,如果這個配置 web.upload.dir 沒有配置具體的路徑的話就會使用 JOB_MANAGER_WEB_TMPDIR_KEY 目錄,那麼我們來看看是否配置了這個目錄呢?

.jpg

確實沒有配置這個 jar 檔案上傳的目錄,那麼我們來看看這個臨時目錄 JOB_MANAGER_WEB_TMPDIR_KEY 是在哪裡的?

又是一個過期的目錄,mmp,繼續跟下去看下這個目錄 TMP_DIR

我們檢視下配置檔案是否有配置這個 web.tmpdir 的值,又是沒有:

so,它肯定使用的是 System.getProperty("java.io.tmpdir") 這個目錄了,

我查看了下我本地電腦起的 job 它的配置中有這個配置如下:

1
java.io.tmpdir	/var/folders/mb/3vpbvkkx13l2jmpt2kmmt0fr0000gn/T/

再觀察了下 job,發現 jobManager 這裡有個 web.tmpdir 的配置:

1
web.tmpdir	/var/folders/mb/3vpbvkkx13l2jmpt2kmmt0fr0000gn/T/flink-web-ea909e9e-4bac-452d-8450-b4ff082298c7

發現這個 web.tmpdir 的就是由 java.io.tmpdir + “flink-web-” + UUID 組成的!

水落石出

進入這個目錄發現我們上傳的 jar 終於被找到了:

配置上傳 jar 目錄確認

上面我們雖然已經知道我們上傳的 jar 是儲存在這個臨時目錄裡,那麼我們現在要驗證一下,我們在配置檔案中配置一下上傳 jar 的固定位置,我們先在目錄下建立一個 jars 目錄,然後在配置檔案中加入這個配置:

1
web.tmpdir: /usr/local/blink-1.5.1/jars

更改之後再看 web.tmpdir 是這樣的:

從 Flink UI 上上傳了三個 jar,檢視 /usr/local/blink-1.5.1/jars/flink-web-7a98165b-1d56-44be-be8c-d0cd9166b179 目錄下就出現了我們的 jar 了。

我們重啟 Flink,發現這三個 jar 又沒有了,這也能解釋之前我自己也遇到過的問題了,Flink 重啟後之前所有上傳的 jar 都被刪除了!作為生產環境,這樣玩,肯定不行的,所以我們還是得固定一個目錄來儲存所有的上傳 jar 包,並且不能夠被刪除,要配置固定的目錄(Flink 重啟也不刪除的話)需要配置如下:

1
web.upload.dir: /usr/local/blink-1.5.1/jars

這樣的話,就可以保證你的 jar 不再會被刪除了!

再來看看原始碼是咋寫的哈:

1
2
3
4
5
6
7
8
//從配置檔案中找 UPLOAD_DIR
final Path uploadDir = Paths.get(
	config.getString(WebOptions.UPLOAD_DIR,	config.getString(WebOptions.TMP_DIR)),
	"flink-web-upload");

return new RestServerEndpointConfiguration(
	restAddress,restBindAddress,port,sslEngineFactory,
	uploadDir,maxContentLength,responseHeaders);

他就是從配置檔案中找 UPLOAD_DIR,如果為 null 就找 TMP_DIR 目錄來當作 jar 上傳的路徑!

總結

本文從知識星球一個朋友的問題,從現象到本質再到解決方案的講解了下如何找到 Flink UI 上上傳的 jar 包藏身之處,並提出瞭如何解決 Flink 上傳的 jar 包被刪除的問