Spark Java Appilcation:java.lang.ClassNotFoundException

时间:2014-06-13 13:30:01

标签: apache-spark

我使用Java创建了一个Apache Spark应用程序。它所做的只是计算包含" spark"字1000次。

这是我的代码:

public class Example1 {
    public static void main(String[] args) {
        String logfile = args[0];
        try{
            SparkConf conf = new SparkConf();
            conf.setAppName("Sample");
            conf.setMaster("spark://<master>:7077");
            conf.set("spark.executor.memory", "1g");
            JavaSparkContext sc = new JavaSparkContext(conf);
            JavaRDD<String> logData = sc.textFile(logfile).cache();
            long count = 0;
            for(int i=0; i<=1000; i++){
                count += logData.filter(new Function<String, Boolean>(){
                    public Boolean call(String s){
                        if (s.toLowerCase().contains("spark"))
                            return true;
                        else
                            return false;
                    }
                }).count();
            }
        }
        catch(Exception ex){
            System.out.println(ex.getMessage());
        }
    }
}

当我在Eclipse IDE中执行调试时,遇到java.lang.ClassNotFoundException

WARN scheduler.TaskSetManager: Loss was due to java.lang.ClassNotFoundException
java.lang.ClassNotFoundException: org.spark.java.examples.Example1$1
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)

我还尝试使用spark-submit在集群内部署它,但仍然遇到了同样的异常。这是堆栈跟踪的一部分:

ERROR Executor: Exception in task ID 4
java.lang.ClassNotFoundException: org.spark.java.examples.Example1$1
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)

有关如何解决此问题的任何想法?提前谢谢!

3 个答案:

答案 0 :(得分:10)

您需要将工作中的罐子交给工人。为此,让maven构建一个jar并将该jar添加到上下文中:

 conf.setJars(new String[]{"path/to/jar/Sample.jar"}); [*]

对于真实的&#39;你需要建立一个带依赖关系的jar(检查Maven shade插件),但对于没有外部依赖关系的简单工作,一个简单的jar就足够了。

[*]我不太熟悉Spark java API,只是假设它应该是这样的。

答案 1 :(得分:3)

您必须将jar包含在worker的类路径中。 您可以通过两种方式执行此操作:

第一个是推荐的方法。

答案 2 :(得分:1)

如果在使用spark-submit命令行时未指定完整包名,也会发生这种情况。如果应用程序的main方法位于test.spark.SimpleApp,那么命令行需要如下所示:

./bin/spark-submit --class "test.spark.SimpleApp" --master local[2] /path_to_project/target/spark_testing-1.0-SNAPSHOT.jar

仅添加--class "SimpleApp"将失败并显示ClassNotFoundException