Spark中的任务因ClassNotFoundException而失败

时间:2015-01-15 14:02:30

标签: java apache-spark cassandra

我正在尝试编写一个简单的java程序,它将通过Spark从Cassandra读取数据。我在POC级别这样做。我的代码看起来像这样

String keyspace = "newkspace1";
String tablename = "newtable5";
public static void main(String[] args) 
    {
        SparkConf conf = new SparkConf();
        conf.setAppName("Cassandra Demo");
        conf.setMaster("spark://ct-0094:7077");
        conf.set("spark.cassandra.connection.host", "192.168.50.124");
        conf.set("spark.cassandra.connection.native.port", "9041");
        conf.set("spark.cassandra.connection.rpc.port", "9160");
        PerformerClass app = new PerformerClass(conf);
        app.run();
    } 
private void run() 
    {
        JavaSparkContext sc = new JavaSparkContext(conf);
        showResults(sc);
        sc.stop();
    }
 private void showResults(JavaSparkContext sc) 
    {
        CassandraJavaPairRDD<Integer, Integer> rdd1 = javaFunctions(sc)
                .cassandraTable(keyspace, tablename, mapColumnTo(Integer.class), mapColumnTo(Integer.class))
                .select("keyval", "rangefield");


        List<Integer> lst = rdd1.keys().toArray();
        for(Integer l : lst)
        {
            System.out.println(l);
        }
    }

当我运行上面的代码时,我得到以下异常(粘贴在下面的堆栈跟踪)

  

15/01/15 19:22:41 WARN scheduler.TaskSetManager:阶段0.0中失去的任务1.0(TID 1,ct-0094):java.lang.ClassNotFoundException:com.datastax.spark.connector.rdd.partitioner .CassandraPartition       在java.net.URLClassLoader $ 1.run(URLClassLoader.java:372)       在java.net.URLClassLoader $ 1.run(URLClassLoader.java:361)       at java.security.AccessController.doPrivileged(Native Method)       在java.net.URLClassLoader.findClass(URLClassLoader.java:360)       at java.lang.ClassLoader.loadClass(ClassLoader.java:424)       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)       at java.lang.Class.forName0(Native Method)       在java.lang.Class.forName(Class.java:340)       在org.apache.spark.serializer.JavaDeserializationStream $$ anon $ 1.resolveClass(JavaSerializer.scala:59)       [...]

我错过了什么?

1 个答案:

答案 0 :(得分:3)

我通过浏览一些博客解决了这个问题。

实际上程序的jar必须包含在程序本身中,如

JavaSparkContext sc = new JavaSparkContext(conf);
sc.addJar("./target/SparkPOC-0.0.1-SNAPSHOT-jar-with-dependencies.jar");

这解决了这个问题。 但是每次运行代码之前,都必须使用Maven Install(即创建jar)代码然后运行它。我仍然在寻找可以避免这些步骤的更好方法。