簡體   English   中英

在flink YARN集群作業中使用JNI

[英]Using JNI in flink YARN cluster jobs

我有一個應用程序通過RemoteExecutionEnvironment scala API將Apache Flink作業分派給AWS Elastic MapReduce YARN集群。

這些作業使用JNI通過C庫運行部分計算。 在開發過程中,我只是在RichCrossFunctionopen()方法中調用System.loadLibrary()來加載這個JNI庫。 這在LocalExecutionEnvironment運行良好。

現在我正在轉向RemoteExecutionEnvironment這似乎不再起作用。 看起來Flink每次調度作業時都使用新的ClassLoader並且我在Native library already loaded in another classloader了計算節點上的Native library already loaded in another classloader錯誤。

一些谷歌搜索通知我,這是Tomcat應用程序的常見問題,Tomcat FAQ中提供了一個解決方案: http//wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat

Flink或YARN是否有類似的解決方案?

此外,是否可以避免每次作業排隊時重新提交JAR? 我總是在這個集群上使用相同的jar,所以這是不必要的開銷......

我通過在我的JNI jar中的靜態初始化程序中調用loadLibrary ,然后將我的JNI jar放在Flink的/lib文件夾中來修復該問題,類似於上面Tomcat鏈接中的模式。

它通過yarn-session.sh啟動過程自動復制到Flink TaskManagers。 這使我能夠以與使用Tomcat相同的方式規避ClassLoader隔離。

我正在使用Maven,因此我使用maven-shade-plugin防止JNI jar被包含在我的uberjar中。

我仍然不知道這是否是最好的方法,因為flink手冊不鼓勵使用/lib文件夾,因為它不尊重他們的ClassLoader管理( https://ci.apache.org/projects/flink/flink-docs -release-1.0 / apis / cluster_execution.html ),但這正是我想要的。

也許另一種方法是使用NativeLoader模式並為每個ClassLoader創建一個單獨的臨時文件,但這會創建一堆重復的本機庫,這種方法適合我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM