背景
今天同事找我帮忙看一个Flink的问题,现象是前几天还能提交的客户端,就在今天突然提交不了作业了,报错提示大概如下(公司的东西涉密)
Caused by: org.apache.flink.api.common.InvalidProgramException: The LocalStreamEnvironment cannot be used when submitting a program through a client, or running in a TestEnvironment context.
at org.apache.flink.streaming.api.environment.LocalStreamEnvironment.(LocalStreamEnvironment.java:68)
at org.apache.flink.streaming.api.environment.LocalStreamEnvironment.(LocalStreamEnvironment.java:58)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.createLocalEnvironment(StreamExecutionEnvironment.java:1626)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.createLocalEnvironment(StreamExecutionEnvironment.java:1612)
问题定位思路
由于我个人的Flink源码还不是很熟悉,于是拿到这个报错我的第一反应是不是哪个配置项配置错了,于是就问同事,是不是最近有什么变更,得到的答案是没有。
既然这样只能开始定位了,我想着既然配置错了走了LocalStreamEnvironment这个分支,那这个配置项的值或者value里面一定会存在相关的关键字的。于是,我就在Flink的配置文件 flink-con.yml
里面找了一遍,发现没有相关配置,那就说明不是配置项的问题(来来回回检查了好几次)。
找不到和哪个配置项有关,那怎么办呢?
没办法只能对着同事给我的堆栈,和我的Flink源码看一下了,于是就开始了找代码的旅程。在找代码的时候发现堆栈里面的代码行数和我代码里面的不一致。我就像我是不是看错代码分支了。经过的我的层层确认,发现我没意拿错代码,于是我就找了我们maven仓库里面的哪个jar包,反编译看了下,结果代码仓库里面的jar反编译的代码行数和我代码仓里面的能对的上。
定位到这儿,就想着是不是环境上的包会不会有问题呢?于是就去Flink客户端目录的lib下面看了一眼,发现有个 flink-streaming-java
的包的版本不是我们部门给出去的版本,我就想到flink一般所有的依赖的class都会在 flink-dist
这个胖包里面,会不会和外面这个不是我们部门给出去的包有关系呢?
于是就让同事把这个未知的包移动到其他地方去。重试了一把,作业可以正常提交了。