我在尝试将 DataFrame 从 Apache Spark 写入 Cassandra 时遇到问题。设置如下:
我在本地计算机上以独立模式运行 Apache Spark 版本 3.3.3 (
bigdatapc
)。我有一个名为 routesDF
的 DataFrame,我正在尝试将其写入 Cassandra 表。 DataFrame 架构如下所示:
routesDF.printSchema()
root
|-- airline: string (nullable = true)
|-- airline_id: integer (nullable = true)
|-- source_airport: string (nullable = true)
|-- source_airport_id: integer (nullable = true)
|-- destination_airport: string (nullable = true)
|-- destination_airport_id: integer (nullable = true)
|-- codeshare: string (nullable = true)
|-- stops: integer (nullable = true)
|-- equipment: string (nullable = true)
要将此 DataFrame 写入 Cassandra,我在 Spark shell 中使用以下命令:
routesDF.write
.format("org.apache.spark.sql.cassandra")
.option("keyspace", "practica")
.option("table", "routes")
.mode("Append")
.save()
我在 Cassandra 中创建了这个表
cqlsh:practica> CREATE TABLE routes (
source_airport text,
destination_airport text,
distance int,
PRIMARY KEY (source_airport, destination_airport)
但是,我遇到了以下错误:
java.lang.NoClassDefFoundError: com/datastax/spark/connector/util/Logging
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
spark-cassandra-connector
库似乎存在问题。启动 Spark shell 时,我已经在 spark-cassandra-connector_2.12-3.3.0.jar
命令中包含了 JAR 文件 bin/spark-shell
,所以我不确定为什么仍然收到此错误。
bin/spark-shell --master spark://bigdatapc:7077 --driver-memory 2G --executor-memory 2G --total-executor-cores 2 --executor-cores 1 --jars postgresql-42.7.3.jar,spark-cassandra-connector_2.12-3.3.0.jar
任何有关如何解决此问题的见解或建议将不胜感激。谢谢!
我尝试将 jar 文件更改为更新版本,
spark-cassandra-connector_2.12-3.5.0.jar
,以及汇编版本,spark-cassandra-connector-assembly_2.12-3.5.0.jar
。两次尝试都没有成功。
第一个错误与我已经提出的错误相同,但对于后者我得到了这个:
ava.lang.NoSuchMethodError: org.apache.spark.sql.connector.write.streaming.StreamingWrite.useCommitCoordinator()Z
at com.datastax.spark.connector.datasource.CassandraBulkWrite.useCommitCoordinator(CassandraWriteBuilder.scala:116)
at org.apache.spark.sql.execution.datasources.v2.V2TableWriteExec.writeWithV2(WriteToDataSourceV2Exec.scala:366)
at org.apache.spark.sql.execution.datasources.v2.V2TableWriteExec.writeWithV2$(WriteToDataSourceV2Exec.scala:353)
at org.apache.spark.sql.execution.datasources.v2.AppendDataExec.writeWithV2(WriteToDataSourceV2Exec.scala:244)
NoClassDefFoundError
通常表示类路径和/或运行不兼容的软件组件存在问题。我建议只指定包坐标(使用 --packages
),而不是提供连接器 JAR,以便在运行时包含所有必要的依赖项。
解决问题的最快方法是进行隔离测试。仅使用最少的选项启动 Spark shell。例如:
$ bin/spark-shell \
--master <spark_master_url> \
--spark.cassandra.connection.host=cassandra_host_ip \
--packages com.datastax.spark:spark-cassandra-connector_2.12:3.3.0
--conf spark.sql.extensions=com.datastax.spark.connector.CassandraSparkExtensions
如果您的 Cassandra 集群启用了身份验证,那么您还需要提供以下凭据:
--conf spark.cassandra.auth.username=<cassandra_role>
--conf spark.cassandra.auth.password=<cassandra_password>
有关所有其他配置选项,请参阅配置参考页面。
需要注意的是,您只能使用 3.3 版本的连接器来与 Spark 3.3 一起运行。 Spark Cassandra 连接器 3.5“仅”适用于 Spark 3.5。有关详细信息,请参阅Spark Cassandra 连接器兼容性表。干杯!