2016-07-08 7 views
2

RemoteExecutionEnvironment scala APIを使用して、Apache FlinkジョブをAWS Elastic MapReduce YARNクラスターにディスパッチするアプリケーションがあります。Flink YARNクラスタージョブでJNIを使​​用する

これらのジョブは、JNIを使​​用して計算の一部をCライブラリで実行します。開発中に私はRichCrossFunctionopen()メソッドでSystem.loadLibrary()コールをこのJNIライブラリをロードするだけです。これはLocalExecutionEnvironmentで問題なく動作しました。

今私はRemoteExecutionEnvironmentに移動していますが、これはもはや機能しません。 Flinkがジョブをディスパッチするたびに新しいClassLoaderを使用していて、計算ノードにNative library already loaded in another classloaderというエラーが表示されているようです。 http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat

はFLINKまたはYARNために利用可能な同様の解決策はあります:

いくつかのグーグルが、これはTomcatのアプリケーションと共通の問題であり、解決策は、TomcatのFAQで利用可能であることを教えてくれましたか?

さらに、ジョブがキューに登録されるたびにJARを再送信しないようにすることはできますか?私は似た、そしてFLINKの/libフォルダに私のJNIの瓶を落とし、私のJNIジャーの静的初期化子でloadLibraryを呼び出すことによって、問題を修正...

答えて

2

を、私はいつもこのクラスタ上で同じjarファイルを使用していますので、不要なオーバーヘッドです上の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用の個別の一時ファイルを作成する方法がありましたが、それは多数のネイティブライブラリを作成することになり、この方法は私には役に立ちます。

関連する問題