【问题标题】:Why does loading dataset from Cassandra fail with NullPointerException?为什么从 Cassandra 加载数据集失败并出现 NullPointerException?
【发布时间】:2017-06-09 12:17:42
【问题描述】:

我正在尝试从 Spark 读取/写入 Cassandra 并使用这些依赖项:

"com.datastax.spark" % "spark-cassandra-connector-unshaded_2.11" % "2.0.0-M3",
"com.datastax.cassandra" % "cassandra-driver-core" % "3.0.0"

这是代码:

import com.datastax.spark.connector._
val sparkConf: SparkConf = new SparkConf().setAppName(appName)
      .set("spark.cassandra.connection.host", hostname)
      .set("spark.cassandra.auth.username",user)
      .set("spark.cassandra.auth.password",password)

 val spark = SparkSession.builder().config(sparkConf).getOrCreate()
val df = spark
      .read
      .format("org.apache.spark.sql.cassandra")
      .options(Map( "table" -> s"$TABLE", "keyspace" -> s"$KEYSPACE"))
      .load() // This Dataset will use a spark.cassandra.input.size of 128

但是在尝试提交火花时,我在上面的 df ...load() 行中得到了这个

Exception in thread "main" java.lang.NullPointerException
    at com.datastax.driver.core.Cluster$Manager.close(Cluster.java:1516)
    at com.datastax.driver.core.Cluster$Manager.access$200(Cluster.java:1237)
    at com.datastax.driver.core.Cluster.closeAsync(Cluster.java:540)
    at com.datastax.driver.core.Cluster.close(Cluster.java:551)
    at com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:162)
    at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$3.apply(CassandraConnector.scala:149)
    at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$3.apply(CassandraConnector.scala:149)
    at com.datastax.spark.connector.cql.RefCountedCache.createNewValueAndKeys(RefCountedCache.scala:31)
    at com.datastax.spark.connector.cql.RefCountedCache.acquire(RefCountedCache.scala:56)
    at com.datastax.spark.connector.cql.CassandraConnector.openSession(CassandraConnector.scala:82)
    at com.datastax.spark.connector.cql.CassandraConnector.withSessionDo(CassandraConnector.scala:110)
    at com.datastax.spark.connector.rdd.partitioner.dht.TokenFactory$.forSystemLocalPartitioner(TokenFactory.scala:98)
    at org.apache.spark.sql.cassandra.CassandraSourceRelation$.apply(CassandraSourceRelation.scala:255)
    at org.apache.spark.sql.cassandra.DefaultSource.createRelation(DefaultSource.scala:55)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:345)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:149)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:122)

【问题讨论】:

    标签: apache-spark apache-spark-sql spark-cassandra-connector


    【解决方案1】:

    M3 是一个里程碑版本,您应该真正使用当前最新的真正版本 2.0.2。

    https://github.com/datastax/spark-cassandra-connector#most-recent-release-scala-docs

    您应该将 java 驱动程序包含在与 Cassandra 连接器相同的项目中。除非您在项目中明确地重新着色,并且仅适用于专家。有关详细信息,请参阅FAQ

    我建议仅使用阴影工件并按照 here 发布的示例进行操作

      "org.apache.spark" %% "spark-core" % sparkVersion % "provided",
      "org.apache.spark" %% "spark-sql" % sparkVersion % "provided",
      "org.apache.spark" %% "spark-hive" % sparkVersion % "provided",
      "com.datastax.spark" %% "spark-cassandra-connector" % connectorVersion % "provided"
    

    启动使用 Spark 包或程序集

    //组装

    https://github.com/datastax/SparkBuildExamples#sbt

    // 包

    https://spark-packages.org/package/datastax/spark-cassandra-connector

    【讨论】:

    • 感谢您的解释!链接有所帮助。我删除了驱动程序。我现在正在这样做(除了 spark-core 等): //sbt "com.datastax.spark" %% "spark-cassandra-connector" % "2.0.2" % "provided", //code val df = spark.read.format("org.apache.spark.sql.cassandra").options(Map( "table" -> s"$TABLE", "keyspace" -> s"$KEYSPACE")).load() 我的 jar 是一个包含所有依赖项的胖 jar。我正在做一个火花提交。然而我又看到了同样的 NPE。
    • SparkBuildExamples 中的示例是这样说的:“请注意,spark-cassandra-connector 应该为 spark-submit 命令提供 '--packages' 标志”。即使是火花提交,我也需要这样做吗?我认为仅在 spark-shell 中需要这样做。这会导致错误吗?如果是,我的 spark-submit 应该是什么样的?
    • 我从 SparkBuildExamples 链接中获取了示例,我正在尝试使用 WriteRead 。原来的 NPE 不见了,我现在得到了这个:Exception in thread "main" java.lang.NoSuchMethodError: com.datastax.spark.connector.cql.CassandraConnector$.apply(Lorg/apache/spark/SparkContext;)Lcom/datastax/spark/connector/cql/CassandraConnector; 有什么建议吗?我正在使用上面的 spark-core、spark-sql 和 Cassandra-connector jar(没有配置单元,这有关系吗?)
    • 您必须使用 --packages 或 --jars 并提供有关第 3 方插件(例如 Cassandra 连接器)的详细信息。如果您在问题中粘贴 spark-submit 命令,如果它失败了,那就太好了。
    • @RussS 非常感谢您的帮助。我能够使用您提供的指针解决此问题!
    猜你喜欢
    • 2017-11-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    相关资源
    最近更新 更多