[英]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.