Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Spark Worker节点找不到我的应用程序类_Java_Apache Spark_Apache Spark Mllib - Fatal编程技术网

Java Apache Spark Worker节点找不到我的应用程序类

Java Apache Spark Worker节点找不到我的应用程序类,java,apache-spark,apache-spark-mllib,Java,Apache Spark,Apache Spark Mllib,在独立群集模式下使用apache spark 1.6,在具有Windows 7操作系统的单机中使用主控和少数工人 我在java应用程序中创建了spark上下文,并编写了几个类(例如扩展了org.apache.spark.api.java.function.function的类),以便对数据执行转换。我把它叫做 javaRDD.map(new MyFunction()); 不幸的是,Spark Workers没有找到MyFunction类,作业因ClassNotFoundException而终止

独立群集模式下使用apache spark 1.6,在具有Windows 7操作系统的单机中使用主控少数工人

我在java应用程序中创建了spark上下文,并编写了几个类(例如扩展了org.apache.spark.api.java.function.function的类),以便对数据执行转换。我把它叫做

javaRDD.map(new MyFunction());
不幸的是,Spark Workers没有找到MyFunction类,作业因ClassNotFoundException而终止

我做了一些研究,发现了一种方法SparkConf.setJars(jars)。因此,我将我的应用程序构建到jar(myapp.jar)中,并将其放在一个目录中(例如D:/spark

但这会导致例外情况:

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)
问题:

  • 如何使应用程序自己的类文件可用于Spark 火花驱动程序的工人

  • 如果我需要向Spark驱动程序提供我的应用程序的jar, 我该怎么做呢。(sparkConf.setJars()方法对我来说失败了 (如上所述)


  • 1和2的简单答案是,您可以通过创建一个fat/uber jar来简化代码的打包(包括驱动程序代码和工作人员所需的内容),该jar将同时用于驱动程序和工作人员

    正如“提交应用程序”页面()中所述,解决这些问题的方法是构建项目的代码,将其与其所有依赖项绑定到一个jar文件中,然后可以像在代码中那样设置该文件

    从该页:

    如果您的代码依赖于其他项目,则需要将它们与应用程序一起打包,以便将代码分发到Spark集群。为此,创建一个包含代码及其依赖项的程序集jar(或“uber”jar)。sbt和Maven都有汇编插件。创建程序集JAR时,将Spark和Hadoop列为提供的依赖项;它们不需要捆绑,因为它们是由集群管理器在运行时提供的。一旦组装好jar,就可以在传递jar时调用bin/spark提交脚本,如图所示

    然后,您可以使用胖jar来运行驱动程序并提供工人所需的所有类

    更新(评论中给出了详细信息): 在将web应用程序部署到应用程序服务器时,解决此问题的最佳方法是(IMO):

  • 构建项目,将特定于web的代码从Spark客户端代码(驱动程序和工作人员的代码)中分离出来
  • 使web项目依赖于spark客户端Jar,然后在调用setJars()时使用Jar文件
  • 这可以通过以下方式实现:

    创建用于spark相关代码的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>
    

    您在您的项目中使用的构建工具是什么?@Ernest Kiwele我正在使用Maven作为此项目的构建工具。好的,我将更新答案,并在答案下给出您的评论。感谢您的回复。我正在开发的应用程序是托管在tomcat服务器上的web应用程序。我在同一台本地计算机上手动运行spark cluster(通过命令提示符)。然后我在我的web应用程序中创建SparkContext,并使用
    sparkConf.setJars(jars)在spark上下文中设置jar执行作业时,spark上下文无法找到myapp.jar。在这方面你能帮我吗
    
    <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>
    
    String[] jars = { "file:D:/foo-spark-client/target/foo-spark-client-1.0-SNAPSHOT-fat.jar" };
    sparkConf.setJars(jars);