我想将结构流数据集写入Cassandra。我在脚本中使用了水印,并且使用了类似的代码
于:https://github.com/polomarcus/Spark-Structured-Streaming-Examples
要么
https://github.com/fhuertas/cassandra-sink-spark-structured-streaming
下沉数据。
脚本的流程为: Kafka->水印事件时间-> groupBy->下沉到Cassandra
val counts= words
.withWatermark("eventTime", "60 seconds")
.groupBy(
window($"eventTime","60 seconds", "30 seconds"),
$"word")
.count()
val query= counts
.writeStream
.format("streamsinkprovider.CassandraSinkProvider")
.outputMode("append")
.start()
并且我尝试了两种方法来解决:
import org.apache.spark.sql.cassandra._
df.select("word","count").as[(String,BigInt)]
.write
.format("org.apache.spark.sql.cassandra")
.mode(SaveMode.Append)
.cassandraFormat("test", CassandraLibrary.CASSANDRA_KEYSPACE)
.save()
和
ds.rdd.saveToCassandra(
CassandraLibrary.CASSANDRA_KEYSPACE,
"test", SomeColumns("word","count"), cassandraWriteConf)
在两种情况下,我都会遇到以下异常:
java.lang.AssertionError:断言失败:没有计划 EventTimeWatermark eventTime#272:时间戳,间隔1分钟
saveToCassandra似乎尝试创建RDD,这导致spark创建新计划。
JDBC接收器(mysql)正常工作,对于相同的代码没有错误。
我已经使用Spark版本2.2.0和2.3.2以及datastax.spark-cassandra-connector 2.0.5和2.3.2尝试了此操作。我尝试使用DSE Cassandra 5.1和Apache Cassandra 3.11
任何想法如何解决这个问题?