使用 Spark 将 DataFrame 写入 Cassandra 时出错:java.lang.NoClassDefFoundError: com/datastax/spark/connector/util/Logging

问题描述 投票:0回答:1

我在尝试将 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)

apache-spark cassandra
1个回答
0
投票

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 连接器兼容性表。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.