Apache spark 带kafka的Spark流媒体-从检查点重新启动

Apache spark 带kafka的Spark流媒体-从检查点重新启动,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我们正在使用Spark Streaming和Kafka构建一个容错系统,并正在测试检查点Spark Streaming,以便在Spark作业因任何原因崩溃时重新启动它。以下是我们的spark流程: Spark Streaming每5秒运行一次(滑动间隔),从kafka读取数据 卡夫卡每秒接收80条信息 我们想要实现的是一个设置,在这个设置中,我们可以关闭spark streaming作业(模拟失败),然后重新启动它,并且仍然确保我们处理来自Kafka的每一条消息。这似乎很好,但以下是我所看到

我们正在使用Spark Streaming和Kafka构建一个容错系统,并正在测试检查点Spark Streaming,以便在Spark作业因任何原因崩溃时重新启动它。以下是我们的spark流程:

  • Spark Streaming每5秒运行一次(滑动间隔),从kafka读取数据
  • 卡夫卡每秒接收80条信息
我们想要实现的是一个设置,在这个设置中,我们可以关闭spark streaming作业(模拟失败),然后重新启动它,并且仍然确保我们处理来自Kafka的每一条消息。这似乎很好,但以下是我所看到的,我不知道该怎么做:

  • 重新启动Spark作业后,将为所有损失的时间创建一个批处理。例如,如果我们在一分钟后关闭并重新启动,则会创建12个批次(每5秒一个批次)。请看下图
  • 这些批处理均未处理任何数据。如下图所示,这些批次的输入大小为0。我们必须等待所有这些完成,然后才能开始处理包含数据的批次。如果我们在几个小时后重新启动作业,情况会变得更糟,因为创建了数百个批次,这些批次不处理任何内容,但必须完成
如果您对此有任何意见,我们将不胜感激:

  • 这是预期的吗?为什么在不处理任何数据的情况下创建批处理(卡夫卡主题持续接收消息)
  • 还有第二件事令人困惑。在我们关闭spark进程一分钟并重新启动之后,kafka主题中有4800(80*60)条消息等待处理。看起来这些消息正在被处理,但我没有;在UI上看不到任何输入大小为4800的批

这是预期的吗?为什么在不处理任何数据的情况下创建批

这就是Sparks容错语义所保证的,即即使您的服务失败,它也可以从最后处理的时间点恢复并继续处理。Spark正在读取检查点数据并启动恢复过程,直到它到达当前时间点。Spark不知道0个事件批处理,因此不进行任何优化

看起来这些消息正在处理中,但我在UI上没有看到任何输入大小为4800的批处理

这可能是由于各种原因造成的。一个常见的情况是,如果您将Sparks back pressure flag设置为true。Spark发现您有一个显著的处理延迟,因此它减少了每批读取的消息数,以便让流作业赶上进度

这是预期的吗?为什么在不处理任何数据的情况下创建批

事实上,使用Kafka的Spark流,当从检查点恢复时,Spark首先生成作业。所有数据都在一个或多个批次中处理(这取决于某些配置),而在web ui中,您只能看到使用0事件执行的所有恢复批次

还有第二件事令人困惑

是的,从网络用户界面来看,这很令人困惑。尝试计算每个批处理的事件数,然后打印该数

DStream.foreachRDD(println(_.count))
您会发现Spark确实处理由检查点创建的批处理,而在web ui中,events num 0

如果应用程序在从失败中恢复后发现很难在一个批处理中处理所有事件,那么如何控制spark创建的批数

尝试搜索spark.streaming.kafka.maxRatePerPartition=>使用新的kafka direct stream API时从每个kafka分区读取数据的最大速率(每秒记录数)

MaxRatePerPartition* partitionOfKafka* YourStreamingBatchDuration * N = eventsNumToProcess

N => After recovered from checkpoint, the num of batches spark need to process.