《从0到1学习Flink》—— 你上传的 jar 包藏到哪里去了?
公众号里回复 面经 可以查看更多 面经和面试题 文章!
公众号里回复 ES 可以查看系列 ElasticSearch 文章!
公众号里回复 Flink 可以查看系列 Flink 文章!
公众号里回复 Spring 可以查看系列 Spring & SpringBoot 文章!
公众号里回复 Java 可以查看系列 Java 文章!
公众号里回复 监控 可以查看更多 监控 文章!
前言
写这篇文章其实也是知识星球里面的一个小伙伴问了这样一个问题:
通过 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
17、Blink 真香