【问题标题】:How to run Apache spark Java program in standalone如何独立运行 Apache spark Java 程序
【发布时间】:2015-09-30 23:34:41
【问题描述】:

我已经为 spark 编写了一个 java 程序,但是我无法从命令行运行它。

我已按照快速入门指南中的步骤进行操作,但出现以下错误。请帮我解决这个问题。

这是错误:

hadoopnod@hadoopnod:~/spark-1.2.1/bin$ ./run-example "SimpleApp " --master local /home/hadoopnod/Spark_Java/target/simple-project-1.0.jarjava.lang.ClassNotFoundException: org.apache.spark.examples.SimpleApp
    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:270)
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:342)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    使用以下命令创建 JAR 文件。您可以在“target/classes”文件夹中找到 SimpleApp.class 文件。 cd 到这个目录。

    jar cfve file.jar SimpleApp.class
    

    将此 JAR 文件放入您的项目的目标目录中。 此 JAR 文件包含您的 SimpleApp 类的依赖项,同时将您的作业提交到 Spark。

    cd 到你的 spark 目录。我正在使用 spark-1.4.0-bin-hadoop2.6。你的 cmd 看起来像这样。

    spark-1.4.0-bin-hadoop2.6>
    

    使用 Spark Submit 提交您的 Spark 程序。如果您有 Harsha 在另一个答案中解释的结构,请提供

    --class org.apache.spark.examples.SimpleApp 
    

    否则

    --class SimpleApp
    

    最后提交你的 spark 程序。

    spark-1.4.0-bin-hadoop2.6>./bin/spark-submit --class SimpleApp --master local[2] /home/hadoopnod/Spark_Java/target/file.jar
    

    【讨论】:

      【解决方案2】:

      脚本./run-example.sh 用于执行分发中包含的示例。要运行示例“SparkPi”,请执行以下操作...

      > cd /apps/spark-1.2.0
      > ./bin/run-example SparkPi
      

      如果你看看这个脚本是如何执行的,它只是一个新的用户友好包装器,它实际上调用了spark-submit

      这是一个执行上面相同的“SparkPi”示例的示例,但使用spark-submit

      > .bin/spark-submit --class org.apache.spark.examples.SparkPi --master local examples/target/spark-examples_2.10-1.2.0.jar
      

      您应该使用spark-submit 来运行您自己的代码。

      【讨论】:

        【解决方案3】:
        ClassNotFoundException: org.apache.spark.examples.SimpleApp
        

        从上面的错误中,很明显它找不到你正在尝试执行的类的原因。您是否将您的 java 项目捆绑到一个 jar 文件中。如果您在创建 jar 文件时有任何其他依赖项,则也需要包含它们。

        假设你有这样的项目结构

        simpleapp
         - src/main/java
           - org.apache.spark.examples
             -SimpleApp.java
         - lib
            - dependent.jars (you can put all dependent jars inside lib directory)
         - target
            - simpleapp.jar (after compiling your source)
        

        您可以使用任何构建工具或任何 IDE 将源代码捆绑到 Jar 文件中。之后,如果您已将 spark/bin 目录添加到路径中。您可以从项目目录执行以下命令。只有在 SimpleApp.java 中有依赖库时,才需要添加 --jars $(echo lib/*.jar | tr ' ' ',' )

        spark-submit --jars $(echo lib/*.jar | tr ' ' ',' ) --class org.apache.spark.examples.SimpleApp --master local[2]  target/simpleapp.jar
        

        【讨论】:

        • 谢谢你的回复,能不能请指导我所有的jar包需要包含在lib文件夹中,以及我们需要从哪里取?
        • 如果您的项目除了来自 JDK 的 jar 之外没有任何其他依赖项,则不需要额外的 jar 文件。但是如果您在程序中使用任何第三方 jar,则需要在执行 spark-submit 之前在 lib 目录中提供它们。因为一旦你提交了程序,你的程序 jar 和依赖的 jar 文件就会通过 spark 分布在其他工作节点上。
        【解决方案4】:

        我有同样的问题。如果您想使用 Spark 快速入门提供的命令,请确保您的项目具有相同的架构:

        find . ./pom.xml ./src ./src/main ./src/main/java ./src/main/java/SimpleApp.java

        对你来说可能不是这样,但我的 pom.xml 构建了我的架构,就像

        ./src/main/java/myGroupId/myArtifactId/SimpleApp.java

        我将我的课程移到默认包中,之后效果很好。

        【讨论】:

          猜你喜欢
          • 2014-05-23
          • 2017-11-29
          • 2018-05-14
          • 1970-01-01
          • 2014-04-13
          • 2021-07-14
          • 2014-06-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多