[英]Using JNI in flink YARN cluster jobs
我有一個應用程序通過RemoteExecutionEnvironment
scala API將Apache Flink作業分派給AWS Elastic MapReduce YARN集群。
這些作業使用JNI通過C庫運行部分計算。 在開發過程中,我只是在RichCrossFunction
的open()
方法中調用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.