を( は、上述したようにsparkConf.setJars()優先mothodは私のために失敗しました)運転者と労働者の両方に使用される脂肪/宇宙瓶を作ることにより、
「提出するアプリケーション」のページ(http://spark.apache.org/docs/latest/submitting-applications.html)に文書化されるように、これらの問題を解決するための方法はあなたが行ったようにあなたがして設定することができ、単一のjarファイルにすべての依存関係とそれを束ねる、プロジェクトのコードを構築することですあなたのコード。そのページから、
:
あなたのコードは、他のプロジェクトに依存している場合、あなたはスパーククラスタにコードを配布するために、あなたのアプリケーションと一緒にそれらをパッケージ化する必要があります。これを行うには、コードとその依存関係を含むアセンブリjar(または "uber" jar)を作成します。 sbtとMavenの両方にアセンブリプラグインがあります。アセンブリのjarを作成するときは、提供された依存関係としてSparkとHadoopをリストします。実行時にクラスタ・マネージャによって提供されるため、これらをバンドルする必要はありません。アセンブルされたjarファイルを取得したら、Jarファイルを渡してbin/spark-submitスクリプトをここに示すように呼び出すことができます。
ドライバを実行し、ワーカーが必要とするすべてのクラスを提供するためにfat jarを使用できます。 (コメントで詳細を与えられた)
UPDATE:
- 構造プロジェクトに:あなたは、アプリケーションサーバーにWebアプリケーションを配備していると 、これを解決するためにあなたの最善の方法は、(IMO)にあります
- WebプロジェクトをsparkクライアントJarに依存させてから、setJars()の呼び出しでJARファイルを使用します。
次のように行うことができます
:
は、JARのMavenプロジェクトを作成するために使用されるスパーク関連のコード
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.foo</groupId>
<artifactId>foo-spark-client</artifactId>
...
<!--Add spark-related dependencies as per your current setup-->
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<!-- Add the plugin to create the uber/fat jar file -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
前のアーティファクトに依存してWebプロジェクトを作成します。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.foo</groupId>
<artifactId>foo-web</artifactId>
<packaging>war</packaging>
...
<!--Add spark client dependency -->
<dependencies>
<dependency>
<groupId>com.company.foo</groupId>
<artifactId>foo-spark-client</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
ここで、spark依存関係は、依存関係に '提供されている'とマークされているため、実行時に実際に必要になる可能性があるため、再追加する必要があることに注意してください。
ここで、Sarkドライバコードは、(希望どおり)ドライバを実行するために必要なものであるため、Webプロジェクト内になければなりません。
これで、com.company.foo:foo-spark-clientアーティファクトのuber jarへのパスでsetJarsを呼び出すだけで済みます。このjarは、foo-spark-clientプロジェクトのターゲットフォルダに作成されます(名前に「-fat.jar」が追加されます)。このJARをTomcatを実行しているサーバー上のアクセス可能なパスに置き、それに応じてWebコードを更新します。
String[] jars = { "file:D:/foo-spark-client/target/foo-spark-client-1.0-SNAPSHOT-fat.jar" };
sparkConf.setJars(jars);
プロジェクトではどのビルドツールを使用していますか? –
@Ernest Kiwele私はこのプロジェクトのビルドツールとしてMavenを使用しています –
OK、答えの下にあなたのコメントがあればそれを更新します。 –