繁体   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