Apache spark 带kafka的Spark流媒体-从检查点重新启动
我们正在使用Spark Streaming和Kafka构建一个容错系统,并正在测试检查点Spark Streaming,以便在Spark作业因任何原因崩溃时重新启动它。以下是我们的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每5秒运行一次(滑动间隔),从kafka读取数据
- 卡夫卡每秒接收80条信息
- 重新启动Spark作业后,将为所有损失的时间创建一个批处理。例如,如果我们在一分钟后关闭并重新启动,则会创建12个批次(每5秒一个批次)。请看下图
- 这些批处理均未处理任何数据。如下图所示,这些批次的输入大小为0。我们必须等待所有这些完成,然后才能开始处理包含数据的批次。如果我们在几个小时后重新启动作业,情况会变得更糟,因为创建了数百个批次,这些批次不处理任何内容,但必须完成
- 这是预期的吗?为什么在不处理任何数据的情况下创建批处理(卡夫卡主题持续接收消息)李>
- 还有第二件事令人困惑。在我们关闭spark进程一分钟并重新启动之后,kafka主题中有4800(80*60)条消息等待处理。看起来这些消息正在被处理,但我没有;在UI上看不到任何输入大小为4800的批
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.