記錄一次由于Jar包沖突導致的神奇問(wèn)題
背景
今天同事找我幫忙看一個(gè)Flink的問(wèn)題,現象是前幾天還能提交的客戶(hù)端,就在今天突然提交不了作業(yè)了,報錯提示大概如下(公司的東西涉密)
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)
問(wèn)題定位思路
由于我個(gè)人的Flink源碼還不是很熟悉,于是拿到這個(gè)報錯我的第一反應是不是哪個(gè)配置項配置錯了,于是就問(wèn)同事,是不是最近有什么變更,得到的答案是沒(méi)有。
既然這樣只能開(kāi)始定位了,我想著(zhù)既然配置錯了走了LocalStreamEnvironment這個(gè)分支,那這個(gè)配置項的值或者value里面一定會(huì )存在相關(guān)的關(guān)鍵字的。于是,我就在Flink的配置文件 flink-con.yml里面找了一遍,發(fā)現沒(méi)有相關(guān)配置,那就說(shuō)明不是配置項的問(wèn)題(來(lái)來(lái)回回檢查了好幾次)。
找不到和哪個(gè)配置項有關(guān),那怎么辦呢?
沒(méi)辦法只能對著(zhù)同事給我的堆棧,和我的Flink源碼看一下了,于是就開(kāi)始了找代碼的旅程。在找代碼的時(shí)候發(fā)現堆棧里面的代碼行數和我代碼里面的不一致。我就像我是不是看錯代碼分支了。經(jīng)過(guò)的我的層層確認,發(fā)現我沒(méi)意拿錯代碼,于是我就找了我們maven倉庫里面的哪個(gè)jar包,反編譯看了下,結果代碼倉庫里面的jar反編譯的代碼行數和我代碼倉里面的能對的上。
定位到這兒,就想著(zhù)是不是環(huán)境上的包會(huì )不會(huì )有問(wèn)題呢?于是就去Flink客戶(hù)端目錄的lib下面看了一眼,發(fā)現有個(gè) flink-streaming-java的包的版本不是我們部門(mén)給出去的版本,我就想到flink一般所有的依賴(lài)的class都會(huì )在 flink-dist這個(gè)胖包里面,會(huì )不會(huì )和外面這個(gè)不是我們部門(mén)給出去的包有關(guān)系呢?
于是就讓同事把這個(gè)未知的包移動(dòng)到其他地方去。重試了一把,作業(yè)可以正常提交了。
評論