【问题标题】:Using JNI in flink YARN cluster jobs在 flink YARN 集群作业中使用 JNI
【发布时间】:2023-03-15 03:40:01
【问题描述】:

我有一个应用程序,它通过 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 错误。

一些谷歌搜索告诉我,这是 Tomcat 应用程序的常见问题,Tomcat 常见问题解答中提供了解决方案:http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat

是否有适用于 Flink 或 YARN 的类似解决方案?

此外,是否可以避免每次作业排队时都重新提交 JAR?我总是在这个集群上使用同一个 jar,所以这是不必要的开销......

【问题讨论】:

    标签: java scala hadoop apache-flink


    【解决方案1】:

    我通过在我的 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 创建一个单独的临时文件,但这会创建一堆重复的本机库,而这种方法对我很有效。

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 2016-12-20
      • 2019-02-25
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多