【问题标题】:Spark and Cassandra Java application: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/DatasetSpark 和 Cassandra Java 应用程序:线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/spark/sql/Dataset
【发布时间】:2017-02-14 16:29:15
【问题描述】:

我得到了一个惊人的 siplme java 应用程序,我几乎从这个例子中复制了它:http://markmail.org/download.xqy?id=zua6upabiylzeetp&number=2

我想做的只是读取表数据并显示在 Eclipse 控制台中。

我的 pom.xml:

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>chat_connaction_test</groupId>
  <artifactId>ChatSparkConnectionTest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
 <dependencies> 
    <dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-core</artifactId>
    <version>3.1.0</version>
    </dependency>

    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.10</artifactId>
    <version>2.0.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.datastax.spark/spark-cassandra-connector_2.10 -->
    <dependency>
    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector_2.10</artifactId>
    <version>2.0.0-M3</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming_2.10 -->
    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming_2.10</artifactId>
    <version>2.0.0</version>
    </dependency>
    <!--
    <dependency> 
    <groupId>org.apache.spark</groupId> 
    <artifactId>spark-hive_2.10</artifactId> 
    <version>1.5.2</version> 
    </dependency>
    -->
  </dependencies>
</project>

还有我的java代码:

    package com.chatSparkConnactionTest;

import static com.datastax.spark.connector.japi.CassandraJavaUtil.javaFunctions;
import java.io.Serializable;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import com.datastax.spark.connector.japi.CassandraRow;

public class JavaDemo implements Serializable {
    private static final long serialVersionUID = 1L;
    public static void main(String[] args) {

        SparkConf conf = new SparkConf().
            setAppName("chat").
            setMaster("local").
            set("spark.executor.memory","1g").
            set("spark.cassandra.connection.host", "127.0.0.1");
        JavaSparkContext sc = new JavaSparkContext(conf);

        JavaRDD<String> cassandraRowsRDD = javaFunctions(sc).cassandraTable(
            "chat", "dictionary")

            .map(new Function<CassandraRow, String>() {
                @Override
                public String call(CassandraRow cassandraRow) throws Exception {
                    String tempResult = cassandraRow.toString();
                    System.out.println(tempResult);
                    return tempResult;
                    }
                }
            );
        System.out.println("Data as CassandraRows: \n" + 
        cassandraRowsRDD.collect().size()); // THIS IS A LINE WITH ERROR
    } 
}

这是我的错误:

16/10/05 20:49:18 信息 CassandraConnector:已连接到 Cassandra cluster:在线程“main”中测试集群异常 java.lang.NoClassDefFoundError: org/apache/spark/sql/Dataset 在 java.lang.Class.getDeclaredMethods0(本机方法)在 java.lang.Class.privateGetDeclaredMethods(未知来源)在 java.lang.Class.getDeclaredMethod(未知来源)在 java.io.ObjectStreamClass.getPrivateMethod(Unknown Source) 在 java.io.ObjectStreamClass.access$1700(Unknown Source) at java.io.ObjectStreamClass$2.run(Unknown Source) at java.io.ObjectStreamClass$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.io.ObjectStreamClass.(Unknown Source) at java.io.ObjectStreamClass.lookup(未知来源)在 java.io.ObjectOutputStream.writeObject0(未知来源)在 java.io.ObjectOutputStream.defaultWriteFields(未知来源)在 java.io.ObjectOutputStream.writeSerialData(未知来源)在 java.io.ObjectOutputStream.writeOrdinaryObject(未知来源)在 java.io.ObjectOutputStream.writeObject0(未知来源)在 java.io.ObjectOutputStream.defaultWriteFields(未知来源)在 java.io.ObjectOutputStream.writeSerialData(未知来源)在 java.io.ObjectOutputStream.writeOrdinaryObject(未知来源)在 java.io.ObjectOutputStream.writeObject0(未知来源)在 java.io.ObjectOutputStream.writeObject(Unknown Source) 在 scala.collection.immutable.$colon$colon.writeObject(List.scala:379) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(未知来源)在 java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) at java.io.ObjectOutputStream.writeSerialData(未知来源)在 java.io.ObjectOutputStream.writeOrdinaryObject(未知来源)在 java.io.ObjectOutputStream.writeObject0(未知来源)在 java.io.ObjectOutputStream.defaultWriteFields(未知来源)在 java.io.ObjectOutputStream.writeSerialData(未知来源)在 java.io.ObjectOutputStream.writeOrdinaryObject(未知来源)在 java.io.ObjectOutputStream.writeObject0(未知来源)在 java.io.ObjectOutputStream.defaultWriteFields(未知来源)在 java.io.ObjectOutputStream.writeSerialData(未知来源)在 java.io.ObjectOutputStream.writeOrdinaryObject(未知来源)在 java.io.ObjectOutputStream.writeObject0(未知来源)在 java.io.ObjectOutputStream.defaultWriteFields(未知来源)在 java.io.ObjectOutputStream.writeSerialData(未知来源)在 java.io.ObjectOutputStream.writeOrdinaryObject(未知来源)在 java.io.ObjectOutputStream.writeObject0(未知来源)在 java.io.ObjectOutputStream.writeObject(Unknown Source) 在 org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:43) 在 org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:100) 在 org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:295) 在 org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:288) 在 org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:108) 在 org.apache.spark.SparkContext.clean(SparkContext.scala:2037) 在 org.apache.spark.SparkContext.runJob(SparkContext.scala:1896) 在 org.apache.spark.SparkContext.runJob(SparkContext.scala:1911) 在 org.apache.spark.rdd.RDD$$anonfun$collect$1.apply(RDD.scala:893) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112) 在 org.apache.spark.rdd.RDD.withScope(RDD.scala:358) 在 org.apache.spark.rdd.RDD.collect(RDD.scala:892) 在 org.apache.spark.api.java.JavaRDDLike$class.collect(JavaRDDLike.scala:360) 在 org.apache.spark.api.java.AbstractJavaRDDLike.collect(JavaRDDLike.scala:45) 在 com.chatSparkConnactionTest.JavaDemo.main(JavaDemo.java:37) 引起 由:java.lang.ClassNotFoundException:org.apache.spark.sql.Dataset 在 java.net.URLClassLoader.findClass(未知来源)在 java.lang.ClassLoader.loadClass(Unknown Source) 在 sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 58 更多

我更新了我的 pom.xml,但这并没有解决错误。谁能帮我解决这个问题?

谢谢!

更新 1: 这是我的构建路径截图: Link to my screenshot

【问题讨论】:

    标签: java apache-spark cassandra datastax


    【解决方案1】:

    我认为您需要确保您的类路径中存在以下资源:

    cassandra-driver-core-2.1.0.jar
    metrics-core-3.0.2.jar
    slf4j-api-1.7.5.jar
    netty-3.9.0-Final.jar
    guava-16.0.1.jar
    

    希望对你有帮助

    【讨论】:

    • 您好阿布,感谢您的回复。我将这些文件添加到我的构建路径中(我将在我的问题末尾添加一个带有屏幕截图的链接)但我仍然遇到相同的错误:Test Cluster Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/火花/sql/数据集。我还能尝试什么?
    • 你能添加这个并告诉我:org.apache.sparkspark-hive_2.101.5。 2
    • 是的,但还是一样:测试线程“main”中的集群异常 java.lang.NoClassDefFoundError: org/apache/spark/sql/Dataset
    • 如何提交 Spark 作业?
    • 全部用 abaghel 注释修复。感谢您的帮助
    【解决方案2】:

    您收到“java.lang.NoClassDefFoundError: org/apache/spark/sql/Dataset”错误,因为您的 pom.xml 文件中缺少“spark-sql”依赖项。

    如果你想用 Spark 2.0.0 读取 Cassandra 表,那么你需要低于最低依赖项。

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.datastax.spark</groupId>
        <artifactId>spark-cassandra-connector_2.11</artifactId>
        <version>2.0.0-M3</version>
    </dependency>
    

    Spark 2.0.0 提供 SparkSession 和 Dataset API。下面是读取 Cassandra 表并打印记录的示例程序。

     public class SparkCassandraDatasetApplication {
     public static void main(String[] args) {
     SparkSession spark = SparkSession
              .builder()
              .appName("SparkCassandraDatasetApplication")
              .config("spark.sql.warehouse.dir", "/file:C:/temp")
              .config("spark.cassandra.connection.host", "127.0.0.1")
              .config("spark.cassandra.connection.port", "9042")
              .master("local[2]")
              .getOrCreate();
    
     //Read data
     Dataset<Row> dataset = spark.read().format("org.apache.spark.sql.cassandra")
            .options(new HashMap<String, String>() {
                {
                    put("keyspace", "mykeyspace");
                    put("table", "mytable");
                }
            }).load();
    
       //Print data
       dataset.show();       
       spark.stop();
       }        
    }
    

    如果您仍想使用 RDD,请使用以下示例程序。

    public class SparkCassandraRDDApplication {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf()
                .setAppName("SparkCassandraRDDApplication")
                .setMaster("local[2]")
                .set("spark.cassandra.connection.host", "127.0.0.1")
                .set("spark.cassandra.connection.port", "9042");
    
        JavaSparkContext sc = new JavaSparkContext(conf);
    
        //Read
        JavaRDD<UserData> resultsRDD = javaFunctions(sc).cassandraTable("mykeyspace", "mytable",CassandraJavaUtil.mapRowTo(UserData.class));
    
        //Print
        resultsRDD.foreach(data -> {
            System.out.println(data.id);
            System.out.println(data.username);
        });
    
        sc.stop();
      }
    }
    

    上面程序中使用的Javabean(UserData)如下所示。

    public class UserData implements Serializable{  
      String id;
      String username;     
      public String getId() {
          return id;
      }
      public void setId(String id) {
          this.id = id;
      }
      public String getUsername() {
         return username;
      }
      public void setUsername(String username) {
         this.username = username;
       }    
    }
    

    【讨论】:

    • 非常感谢!今天的所有工作(我按照你的描述添加了依赖项)
    • 只是一个额外的小问题 - 如果我需要 json 作为输出,哪种方式更可取 - SparkSession 和 Dataset APIRDD?跨度>
    • 我研究过,Dataset API 在我的情况下绝对是可取的
    • 能否请您添加完整的 POM 以及如何将其提交给 spark?
    • @hasson 请发布一个单独的问题,说明您在做什么以及遇到的问题,我会尽力帮助您。谢谢
    【解决方案3】:

    删除

    <!-- https://mvnrepository.com/artifact/com.datastax.spark/spark-cassandra-connector-java_2.10 -->
    <dependency>
    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector-java_2.10</artifactId>
    <version>1.6.0-M1</version>
    </dependency>
    

    您正在类路径上混合版本。 java 模块包含在 Spark Cassandra Connector 2.0.0 的核心模块中。所以这只是引用了 spark 1.6 的引用。

    【讨论】:

    • 感谢您的回复。还是报错。这就是我现在的依赖项(我更新了主要问题)
    • 全部用 abaghel 注释修复。再次感谢
    猜你喜欢
    • 2017-01-30
    • 2022-01-07
    • 2021-07-22
    • 2018-08-09
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2016-04-24
    相关资源
    最近更新 更多