Apache spark 为什么从Cassandra加载数据集失败并导致NullPointerException?
我正在尝试从Spark读取/写入Cassandra,并使用以下依赖项:Apache spark 为什么从Cassandra加载数据集失败并导致NullPointerException?,apache-spark,apache-spark-sql,spark-cassandra-connector,Apache Spark,Apache Spark Sql,Spark Cassandra Connector,我正在尝试从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 = ne
"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
然而,在尝试spark submit时,我在上面的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)
M3是一个里程碑式的版本,您应该真正使用real release 2.0.2,它是当前最新的版本 您不应该将java驱动程序与Cassandra连接器包含在同一个项目中。除非您在项目内部明确地重新着色,并且仅限专家使用。有关更多详细信息,请参阅 我建议只使用着色工件,并遵循发布的示例 启动使用Spark软件包或组件 //装配 //包裹
M3是一个里程碑式的版本,您应该真正使用当前最新的real release 2.0.2 您不应该将java驱动程序与Cassandra连接器包含在同一个项目中。除非您在项目内部明确地重新着色,并且仅限专家使用。有关更多详细信息,请参阅 我建议只使用着色工件,并遵循发布的示例 启动使用Spark软件包或组件 //装配 //包裹
谢谢您的解释!这些链接起了作用。我撤掉了司机。我现在正在这样做(除了spark core等)://sbt
“com.datastax.spark”%%“spark cassandra连接器”%%“2.0.2”%”,“提供”
//codeval df=spark.read.format(“org.apache.spark.sql.cassandra”).options(映射(“表”->s“$table”,“键空间”->s$keyspace”).load()
而我的jar是一个包含所有依赖项的胖jar。我正在做一件事。但是我又看到了相同的NPE。SparkBuildExamples中的示例是这样说的:“请注意,spark cassandra连接器应该为spark submit命令提供'--packages'标志”。我是否需要这样做,即使是为spark提交?我想这只需要在spark shell中进行。这会导致错误吗?如果是,我的spark submit应该是什么样子的?我从SparkBuildExamples链接中选取了这个示例,现在我正在尝试WriteRead。原来的NPE不见了,我现在得到了这个:线程“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连接器JAR(没有hive,这有关系吗?),您必须使用--packages或--JAR,并提供有关第三方插件(如Cassandra连接器)的详细信息。如果您将spark submit命令粘贴到问题中,如果它失败,这将是一件好事。@RussS非常感谢您的帮助。我能够用你提供的指针解决这个问题!谢谢你的解释!这些链接起了作用。我撤掉了司机。我现在正在这样做(除了spark core等)://sbt“com.datastax.spark”%%“spark cassandra连接器”%%“2.0.2”%”,“提供”
//codeval df=spark.read.format(“org.apache.spark.sql.cassandra”).options(映射(“表”->s“$table”,“键空间”->s$keyspace”).load()
而我的jar是一个包含所有依赖项的胖jar。我正在做一件事。但是我又看到了相同的NPE。SparkBuildExamples中的示例是这样说的:“请注意,spark cassandra连接器应该为spark submit命令提供'--packages'标志”。我是否需要这样做,即使是为spark提交?我想这只需要在spark shell中进行。这会导致错误吗?如果是,我的spark submit应该是什么样子的?我从SparkBuildExamples链接中选取了这个示例,现在我正在尝试WriteRead。原来的NPE不见了,我现在得到了这个:线程“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连接器JAR(没有hive,这有关系吗?),您必须使用--packages或--JAR,并提供有关第三方插件(如Cassandra连接器)的详细信息。如果您将spark submit命令粘贴到问题中,如果它失败,这将是一件好事。@RussS非常感谢您的帮助。我能够用你提供的指针解决这个问题!
"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"