Spark 中的任务因 ClassNotFoundException 而失败
Task fails in Spark with ClassNotFoundException
我正在尝试编写一个简单的 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: Lost task 1.0 in stage 0.0 (TID 1, ct-0094): java.lang.ClassNotFoundException: com.datastax.spark.connector.rdd.partitioner.CassandraPartition
at java.net.URLClassLoader.run(URLClassLoader.java:372)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at 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)
at java.lang.Class.forName(Class.java:340)
at org.apache.spark.serializer.JavaDeserializationStream$$anon.resolveClass(JavaSerializer.scala:59)
[...]
我错过了什么?
我自己通过一些博客解决了这个问题。
实际上程序的jar必须包含在程序本身中,如
JavaSparkContext sc = new JavaSparkContext(conf);
sc.addJar("./target/SparkPOC-0.0.1-SNAPSHOT-jar-with-dependencies.jar");
这解决了问题。
但是每次在 运行 安装您的代码之前,您都必须 Maven 安装(即创建 jar)您的代码,然后 运行 它。我仍在寻找可以避免这些步骤的更好方法。
我正在尝试编写一个简单的 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: Lost task 1.0 in stage 0.0 (TID 1, ct-0094): java.lang.ClassNotFoundException: com.datastax.spark.connector.rdd.partitioner.CassandraPartition at java.net.URLClassLoader.run(URLClassLoader.java:372) at java.net.URLClassLoader.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at 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) at java.lang.Class.forName(Class.java:340) at org.apache.spark.serializer.JavaDeserializationStream$$anon.resolveClass(JavaSerializer.scala:59) [...]
我错过了什么?
我自己通过一些博客解决了这个问题。
实际上程序的jar必须包含在程序本身中,如
JavaSparkContext sc = new JavaSparkContext(conf);
sc.addJar("./target/SparkPOC-0.0.1-SNAPSHOT-jar-with-dependencies.jar");
这解决了问题。 但是每次在 运行 安装您的代码之前,您都必须 Maven 安装(即创建 jar)您的代码,然后 运行 它。我仍在寻找可以避免这些步骤的更好方法。