在Spark Structured Streaming中使用Kafka接收器时是否必须检查点?

时间:2018-04-09 19:35:39

标签: java apache-spark spark-structured-streaming

我尝试使用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水槽时是否必须使用检查点?我在文档中找不到答案。

1 个答案:

答案 0 :(得分:1)

需要检查点以跟踪确切处理和写入接收器的内容。

假设您在输入文件夹中有一堆文件。当您启动流时,spark开始处理来自源的文件。只有在使用检查点存储所有进度信息时,才能确保这些文件被处理并写入接收器。

换句话说,不需要对接收器进行检查点,而是对整个流进行检查点,以确保不会一遍又一遍地处理相同的输入数据。