2016-04-22 6 views
0

私はカスタムライブラリ(Scalaでコード化されていますが、内部的にJNI経由でネイティブライブラリを呼び出しています)をApache Sparkワーカーノードにデプロイしてクラスタ内の他のアプリケーションが使用できるようにする方法はありますか?基本的には、Sparkをカスタム機能で拡張して、どのジョブでも使用できるようにしたいと考えています。カスタムライブラリをApache Sparkにデプロイするには?

私が理解する限り、スパーク送信はジョブを送信するためのもので、私の望むものではありません。

jarファイルにネイティブライブラリをパックすると、Context.addJar()はそのトリックを行う予定ですか?実行時にネイティブライブラリをいくつかの一時ディレクトリに展開する必要があります。これはSpark環境のオプションでもありますか?

ありがとうございます。

+0

*「ネイティブライブラリを呼び出すいくつかのScalaコード」*は、コードがSparkジョブ内で実行されていることを意味しますか? –

+0

そのコードはSparkジョブから呼び出せるようにする必要があります。私は明確にするために質問を編集します。 –

+0

Sparkの仕事の外部ライブラリを利用したいですか?あなたはあなたの仕事のuber JARの中にそれを詰め込むことを考えましたか? –

答えて

3

​​は、関心のあるいくつかのパラメータをとります。 --packagesおよび--jarsである。カスタム.jar--jarsに追加できます。あなたはmaven座標を--packagesに渡すことができます。ような何か:あなたはREPLを使用する場合

spark-submit ... --packages org.apache.spark:spark-streaming-kafka_2.10:1.6.0,org.apache.kafka:kafka_2.10:0.8.2.0 --jars localpath/to/your.jar 

spark-shellでこれらの仕事もそう、あなたのカスタムjarファイルと任意の外部依存関係を展開することができます。

ファイルが特に大きい場合は、を使用してコンテキストに追加できます。しかし、これは維持する痛みです。実際に効率的に実行するには、JARファイルをHDFSにデプロイし、HDFSがすべてのノード間で複製するようにする必要があります.HDFSには1つのノードにJARファイルしかない場合は、そしてバージョン管理についてはどうしますか? JARファイルを変更した場合、HDFSに複数のバージョンを用意する必要があるため、ほとんどの場合、古いジョブをコード化しておくために古いファイルを保存する必要があります。あなたは新しいバージョンを使用するために他のジョブを再コンパイルするつもりですか? --packages--jarsについての素敵なことは、そのすべての混乱はあなたのために処理されるということです。

しかし、あなたのカスタムJARがそれを保証するのに十分な大きさであるとすれば、それはSparkContext.addJarで含めることができますが、私が言ったように - これは標準的な方法ではありません。 spark-streaming-kafkaのようなSparkの半コア拡張でも、--packagesオプションで配信されます。

+0

これは実際に私のライブラリを展開して、他のジョブでも使用できるでしょうか?私は自分の仕事をするつもりではなく、Sparkを広げてすべての仕事が私の図書館に電話できるようにしています。 –

+0

これは、この回答のコマンドを使用する必要がある他のジョブです。これはあなたがカスタムコードをデプロイする方法です。あなたはそれらにあなたのjarを与え、上記のようなコマンド( '--jars')を実行させるか、' maven'アーティファクトを作成して座標を与えます。私の例を見ると、 'spark-streaming-kafka'はSparkの拡張です。 Sparkを拡張していることを正確にやろうとしています。これが標準的な方法です。 –

+0

しかし、新しいジャーナルはそれぞれ新しいジョブにコピーされませんか?理想的には、私はそれを各ワーカー・ノードに「インストール」して、他のジョブで使用できる状態にします。 –