flink提交yarn問題排查
持續創作,加速成長!這是我參與「掘金日新計劃 · 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的包,如下圖
放到提交叢集的客戶機部署的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.
缺少如下圖的包:
注意:同時需要把你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