【问题标题】:Error in retrieving data from Cassandra using Apache Spark Connector in java在 java 中使用 Apache Spark 连接器从 Cassandra 检索数据时出错
【发布时间】:2014-12-24 07:24:25
【问题描述】:

我在使用 sparkCassandraConnector 从 Cassandra 表中检索数据时遇到问题。我在 Cassandra 中创建了一个名为“ks”的名称空间和一个名为“student”的表。表格如下:

标识 |名字

----+------------

10 |凯瑟琳

我通过运行 start-all.sh 在本地启动 Spark

然后我创建了这个类“SparkCassandraConnector”,它有一个连接 spark 和 Cassandra 的命令。我想做的是从学生表中检索数据并将其打印在屏幕上。

我得到的错误是“java.lang.ClassNotFoundException: SparkCassandraConnector$Student java.net.URLClassLoader$1.run(URLClassLoader.java:372) java.net.URLClassLoader$1.run(URLClassLoader.java:361) java.security.AccessController.doPrivileged(本机方法) java.net.URLClassLoader.findClass(URLClassLoader.java:360) java.lang.ClassLoader.loadClass(ClassLoader.java:424) java.lang.ClassLoader.loadClass(ClassLoader.java:357) java.lang.Class.forName0(本机方法) java.lang.Class.forName(Class.java:340)

这是我的程序:

import org.apache.commons.lang.StringUtils;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import java.io.Serializable;

import static com.datastax.spark.connector.CassandraJavaUtil.javaFunctions;

public class SparkCassandraConnector  implements Serializable {
public static void main(String[] args) {

    SparkConf conf = new SparkConf().setAppName("Simple Application");

    conf.setMaster("spark://127.0.0.1:7077");
    conf.set("spark.cassandra.connection.host", "127.0.0.1");
    String[] jars = new String[10];
    jars[0] = "~/.m2/repository/com/datastax/spark/spark-cassandra-connector-java_2.10/1.1.0-alpha4/spark-cassandra-connector-java_2.10-1.1.0-alpha4.jar";
    jars[1] = "~/.m2/repository/com/datastax/cassandra/cassandra-driver-core/2.1.0/cassandra-driver-core-2.1.0.jar";
    jars[3] = "~/.m2/repository/com/datastax/spark/spark-cassandra-connector_2.10/1.1.0-alpha4/spark-cassandra-connector_2.10-1.1.0-alpha4.jar";
    jars[4] = "~/.m2/repository/com/datastax/cassandra/cassandra-driver-core/2.1.0/cassandra-driver-core-2.1.0.jar";
    jars[5] = "~/.m2/repository/org/apache/cassandra/cassandra-thrift/2.1.0/cassandra-thrift-2.1.0.jar";
    jars[6] = "~/.m2/repository/org/apache/cassandra/cassandra-clientutil/2.1.0/cassandra-clientutil-2.1.0.jar";
    conf = conf.setJars(jars);
    JavaSparkContext sc = new JavaSparkContext(conf);

    JavaRDD<String> rdd = javaFunctions(sc).cassandraTable("ks", "student", Student.class)
            .map(new org.apache.spark.api.java.function.Function<Student, String>() {
                @Override
                public String call(Student person) throws Exception {
                    return person.toString();
                }
            });
    System.out.println("Data as Person beans: \n" + StringUtils.join(rdd.collect(), "\n"));
}
public static class Student implements  Serializable{

    private Integer id;
    private String name;

    public Student(){

    }
    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

}

这是我的 POM 文件:

<dependencies>


    <!--Spark-->

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.10</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>2.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.datastax.spark</groupId>
        <artifactId>spark-cassandra-connector_2.10</artifactId>
        <version>1.1.0-alpha4</version>
    </dependency>

    <dependency>
        <groupId>com.datastax.spark</groupId>
        <artifactId>spark-cassandra-connector-java_2.10</artifactId>
        <version>1.1.0-alpha4</version>
    </dependency>

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-catalyst_2.10</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

【问题讨论】:

  • 我建议你继续使用组装插件,你可以在这里阅读它的动机和 sbt 示例:eugenezhulenev.com/blog/2014/10/18/…
  • 感谢您的链接。但是你同意我提供了必要的 jar 文件,我不应该得到那个错误。

标签: java cassandra apache-spark


【解决方案1】:

在提供的 jar 中,缺少包含作业的 jar,因此缺少 Student.class。快速修复它以添加项目的 ./target 文件夹中的 jar。

另一种方法是将您的工作和所有依赖项打包在一个“uber jar”中,并将该 uber jar 用作仅声明的 jar。查看maven shade plugin.

也可以使用spark-submit --jars 选项从命令行提供罐子。

【讨论】:

  • 我尝试添加主类的jar(第一个建议的解决方案),但它不起作用。然后我尝试使用 spark-submit --jars 但我收到了无法识别的 -jar 选项的错误。我尝试创建 Uber jar 并且此解决方案有效。感谢@maasg
猜你喜欢
  • 2015-08-16
  • 2017-01-13
  • 2016-02-05
  • 1970-01-01
  • 2016-04-29
  • 2017-01-18
  • 2015-08-24
  • 1970-01-01
  • 2015-09-20
相关资源
最近更新 更多