2016-03-30 1 views
0

Использование апачского искру 1,6 в режиме с автономным кластера с микросхемой Мастер и нескольких рабочих в одной машины, имеющей Windows 7 OS.Apache Спарк работник Вершина не смог найти свои приложения классов

Я создал контекст искры внутри приложения Java и написал несколько классов (например MyFunction, который проходит org.apache.spark.api.java.function.Function) для того, чтобы выполнить преобразование данных. Я назвал это как

javaRDD.map(new MyFunction()); 

К сожалению, Спарк Рабочие не находит класс MyFunction и работа прекращается с ClassNotFoundException ...

Я сделал некоторые исследования и нашел метод SparkConf.setJars (банок) , Таким образом, я построю свою заявку в банк (MyApp.jar) и поместил его в каталоге (например D:/искра)

String[] jars = { "file:D:/spark/myappjar" }; 
sparkConf.setJars(jars); 

Но это приводит к Exception:

2016-03-30 15:27:07 WARN TaskSetManager:70 
- Lost task 0.0 in stage 0.0 (TID 0, alivia): 
java.lang.ClassNotFoundException: com.ai.cache.spark.NumericFieldsToVector 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:274) 

Вопросы:

  1. Как мне сделать собственные файлы классов приложения Avaí Lable Спарк работник из Спарк драйвера программы

  2. Если я должен предоставить банку моего приложения Спарк программы драйвера, Как я могу сделать это. (В sparkConf.setJars() Mothod не удалось для меня, как описано выше)

+0

Какой инструмент построения вы используете в своем проекте? –

+0

@Ernest Kiwele Я использую Maven как инструмент построения для этого проекта –

+0

ОК, я обновлю ответ, также предоставил ваш комментарий в ответ. –

ответ

0

Короткий ответ на как 1 и 2 является то, что вы можете упростить упаковку кода (как код драйвера и что необходимы рабочих) путем создания жировой/uber-баночки, которая будет использоваться как для водителя, так и для рабочих.

Как описано на странице «Отправляющие приложения» (http://spark.apache.org/docs/latest/submitting-applications.html), способ решения этих проблем состоит в том, чтобы создать код проекта, связав его со всеми его зависимостями в один файл jar, который вы могли бы установить так же, как в ваш код.

С этой страницы:

Если ваш код зависит от других проектов, вам нужно будет упаковать их вместе с приложением для того, чтобы распределить код искрового кластера. Для этого создайте сборку jar (или «uber» jar), содержащую ваш код и его зависимости. Оба sbt и Maven имеют сборные плагины. При создании сборочных банок укажите Spark и Hadoop в качестве предоставленных зависимостей; их не нужно связывать, поскольку они предоставляются менеджером кластера во время выполнения. После того, как у вас есть собранная банка, вы можете вызвать сценарий bin/spark-submit, как показано здесь, пропуская банку.

Затем вы можете использовать толстую банку для запуска водителя и обеспечения всех классов, необходимых работникам.

UPDATE (учитывая подробности в комментариях): Как вы развертывания веб-приложений на сервере приложений, лучшим способом решить эту проблему является (ИМО):

  1. Структура вашего проекта (код для водителя и работников)
  2. Сделать веб-проект зависеть от искрового клиента 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); 
+0

Спасибо, что ответили. Приложение, которое я разрабатываю, - это веб-приложение, размещенное на сервере tomcat. Я запускаю искровой кластер вручную (через командную строку) на том же локальном компьютере. Затем я создаю SparkContext в своем веб-приложении и устанавливаю банку в контексте искры с помощью 'sparkConf.setJars (jars);' и когда я выполняю задание, контекст искры не может найти ** myapp.jar **. Можете ли вы мне помочь в этом отношении? –

Смежные вопросы