我尝试使用Spark Structured Streaming将聚合数据写入Kafka。这是我的代码:
dataset
.writeStream()
.queryName(queryName)
.outputMode(OutputMode.Append())
.format("kafka")
.option("kafka.bootstrap.servers", kafkaBootstrapServers)
.option("topic", "topic")
.trigger(Trigger.ProcessingTime("15 seconds"))
// .option("checkpointLocation", checkpointLocation)
.start();
如果我评论checkpointLocation
,我会:
Exception in thread "main" org.apache.spark.sql.AnalysisException: checkpointLocation must be specified either through option("checkpointLocation", ...) or SparkSession.conf.set("spark.sql.streaming.checkpointLocation", ...);
at org.apache.spark.sql.streaming.StreamingQueryManager$$anonfun$3.apply(StreamingQueryManager.scala:210)
at org.apache.spark.sql.streaming.StreamingQueryManager$$anonfun$3.apply(StreamingQueryManager.scala:205)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.streaming.StreamingQueryManager.createQuery(StreamingQueryManager.scala:204)
at org.apache.spark.sql.streaming.StreamingQueryManager.startQuery(StreamingQueryManager.scala:278)
at org.apache.spark.sql.streaming.DataStreamWriter.start(DataStreamWriter.scala:282)
at <myClass>)
使用Kafka水槽时是否必须使用检查点?我在文档中找不到答案。
答案 0 :(得分:1)
需要检查点以跟踪确切处理和写入接收器的内容。
假设您在输入文件夹中有一堆文件。当您启动流时,spark开始处理来自源的文件。只有在使用检查点存储所有进度信息时,才能确保这些文件被处理并写入接收器。
换句话说,不需要对接收器进行检查点,而是对整个流进行检查点,以确保不会一遍又一遍地处理相同的输入数据。