Короткий ответ на как 1 и 2 является то, что вы можете упростить упаковку кода (как код драйвера и что необходимы рабочих) путем создания жировой/uber-баночки, которая будет использоваться как для водителя, так и для рабочих.
Как описано на странице «Отправляющие приложения» (http://spark.apache.org/docs/latest/submitting-applications.html), способ решения этих проблем состоит в том, чтобы создать код проекта, связав его со всеми его зависимостями в один файл jar, который вы могли бы установить так же, как в ваш код.
С этой страницы:
Если ваш код зависит от других проектов, вам нужно будет упаковать их вместе с приложением для того, чтобы распределить код искрового кластера. Для этого создайте сборку jar (или «uber» jar), содержащую ваш код и его зависимости. Оба sbt и Maven имеют сборные плагины. При создании сборочных банок укажите Spark и Hadoop в качестве предоставленных зависимостей; их не нужно связывать, поскольку они предоставляются менеджером кластера во время выполнения. После того, как у вас есть собранная банка, вы можете вызвать сценарий bin/spark-submit, как показано здесь, пропуская банку.
Затем вы можете использовать толстую банку для запуска водителя и обеспечения всех классов, необходимых работникам.
UPDATE (учитывая подробности в комментариях): Как вы развертывания веб-приложений на сервере приложений, лучшим способом решить эту проблему является (ИМО):
- Структура вашего проекта (код для водителя и работников)
- Сделать веб-проект зависеть от искрового клиента Jar, а затем использовать JAR-файл при вызове setJars().
Это может быть сделано следующим образом:
Создание 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>
Создать веб-проект, который зависит от предыдущего артефакта
<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>
Обратите внимание, что вам может потребоваться повторно добавить сюда искровые зависимости, поскольку они отмечены как «предоставленные» в зависимости, но на самом деле могут потребоваться во время выполнения.
Теперь код вашего Sark-драйвера должен быть в веб-проекте, так как ожидается, что он запустит драйвер (как вы предложили).
С этим все, что вам нужно сделать, это вызвать setJars с помощью пути к uber jar com.company.foo:foo-spark-client артефакта. Эта банка будет создана в целевой папке проекта foo-spark-client (с добавлением «-fat.jar» к имени). Поместите этот JAR на доступный путь на сервере под управлением Tomcat, а затем обновите свой веб-код соответственно:
String[] jars = { "file:D:/foo-spark-client/target/foo-spark-client-1.0-SNAPSHOT-fat.jar" };
sparkConf.setJars(jars);
Какой инструмент построения вы используете в своем проекте? –
@Ernest Kiwele Я использую Maven как инструмент построения для этого проекта –
ОК, я обновлю ответ, также предоставил ваш комментарий в ответ. –