前言
寫這篇文章其實也是知識星球裏面的一個小夥伴問了這樣一個問題:
通過 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
目錄,那麼我們來看看是否配置了這個目錄呢?
確實沒有配置這個 jar 文件上傳的目錄,那麼我們來看看這個臨時目錄 JOB_MANAGER_WEB_TMPDIR_KEY
是在哪裏的?
又是一個過期的目錄,mmp,繼續跟下去看下這個目錄 TMP_DIR
。
我們查看下配置文件是否有配置這個 web.tmpdir
的值,又是沒有:
so,它肯定使用的是 System.getProperty("java.io.tmpdir")
這個目錄了,
我查看了下我本地電腦起的 job 它的配置中有這個配置如下:
java.io.tmpdir /var/folders/mb/3vpbvkkx13l2jmpt2kmmt0fr0000gn/T/
再觀察了下 job,發現 jobManager 這裏有個 web.tmpdir
的配置:
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 目錄,然後在配置文件中加入這個配置:
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 重啓也不刪除的話)需要配置如下:
web.upload.dir: /usr/local/blink-1.5.1/jars
這樣的話,就可以保證你的 jar 不再會被刪除了!
再來看看源碼是咋寫的哈:
//從配置文件中找 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 包被刪除的問題。
本篇文章連接是:http://www.54tianzhisheng.cn/2019/03/13/flink-job-jars/
關注我
微信公衆號:zhisheng
另外我自己整理了些 Flink 的學習資料,目前已經全部放到微信公衆號了。你可以加我的微信:zhisheng_tian,然後回覆關鍵字:Flink 即可無條件獲取到。
更多私密資料請加入知識星球!
Github 代碼倉庫
https://github.com/zhisheng17/flink-learning/
以後這個項目的所有代碼都將放在這個倉庫裏,包含了自己學習 flink 的一些 demo 和博客。
相關文章
1、《從0到1學習Flink》—— Apache Flink 介紹
2、《從0到1學習Flink》—— Mac 上搭建 Flink 1.6.0 環境並構建運行簡單程序入門
3、《從0到1學習Flink》—— Flink 配置文件詳解
4、《從0到1學習Flink》—— Data Source 介紹
5、《從0到1學習Flink》—— 如何自定義 Data Source ?
6、《從0到1學習Flink》—— Data Sink 介紹
7、《從0到1學習Flink》—— 如何自定義 Data Sink ?
8、《從0到1學習Flink》—— Flink Data transformation(轉換)
9、《從0到1學習Flink》—— 介紹Flink中的Stream Windows
10、《從0到1學習Flink》—— Flink 中的幾種 Time 詳解
11、《從0到1學習Flink》—— Flink 寫入數據到 ElasticSearch
12、《從0到1學習Flink》—— Flink 項目如何運行?
13、《從0到1學習Flink》—— Flink 寫入數據到 Kafka
14、《從0到1學習Flink》—— Flink JobManager 高可用性配置
15、《從0到1學習Flink》—— Flink parallelism 和 Slot 介紹
16、《從0到1學習Flink》—— Flink 讀取 Kafka 數據批量寫入到 MySQL