flink提交yarn問題排查

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第2天,點選檢視活動詳情

場景:

下面的錯誤是我在將原生代碼打包以後使用伺服器將flink的任務程式碼提交到yarn以後產生的,主要的原因是伺服器使用的flink依賴環境中缺少相應的環境依賴。我們需要到flink官網中找到這些依賴下載下來放到伺服器對應的flink/lib中。

重要錯誤提示:

Caused by: org.apache.flink.table.api.NoMatchingTableFactoryException: Could not find a suitable table factory for 'org.apache.flink.table.factories.TableSourceFactory' in the classpath.

這是在提交yarn時報的錯誤,原因其實就是少了一些包,提交的集群后一些依賴包使用flink的lib目錄下的,所以我需要將一些依賴包放到lib目錄下。

我們看到缺少的是org.apache.flink.table.factories.TableSourceFactory類,所以對應的應該是flink連線JDBC的包。這裡我們去官網上下載你對應flink版本的連線JDBC的包,如下圖

001.png 放到提交叢集的客戶機部署的flink的lib目錄下。

可以看到上面最主要的是缺少依賴包,其實像很多類似的錯誤都是由於缺少依賴引起的,尤其是當你引入Table Api使用JDBC、Hive、kafka等對應的操作api時,一定要去官網指定版本把包下下來放到lib目錄下。

類似的錯誤

Caused by: org.apache.flink.table.api.NoMatchingTableFactoryException: Could not find a suitable table factory for 'org.apache.flink.table.factories.CatalogFactory' in the classpath.

缺少如下圖的包:

002.png

注意:同時需要把你maven的依賴新增範圍

bash <scope>provided</scope> 例如:

bash <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner-blink_${scala.binary.version}</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> 這是由於flink高版本的ClassLoader解析順序為Child優先,所以在maven打jar包時,不要把lib中有的依賴打入,否則會引來衝突。當然你也可以在$FLINK_HOME/conf/flink-conf.yaml中修改為parent優先使用。

bash classloader.resolve-order: parent-first