我们正在使用Spark Streaming和Kafka构建容错系统,并正在测试检查点火花流,以便我们可以选择在因任何原因崩溃时重新启动spark作业。这就是我们的火花过程:
我们想要实现的是一个设置,我们可以关闭火花流工作(模仿失败),然后重新启动它,并确保我们处理来自Kafka的每条消息。这似乎工作正常,但是,我看到的是我不知道该怎么做:
对此的任何意见均表示赞赏:
答案 0 :(得分:1)
这是预期的吗?为什么批处理在不处理任何数据时被创建
这就是Sparks容错语义保证的,即使您的服务失败,它也可以从最后处理的时间点开始并继续处理。 Spark正在读取检查点数据并启动恢复过程,直到达到当前时间点。 Spark不知道0个事件批次,因此无法优化它们。
看起来正在处理这些消息,但我在UI上看不到任何输入大小为4800的批处理
这可能由于各种原因而发生。常见的一种是如果你将Sparks背压标志设置为true。 Spark看到你有一个重要的处理延迟,因此它减少了每批读取的消息数量,以便让流式作业能够赶上。
答案 1 :(得分:0)
这是预期的吗?为什么批处理在不处理任何数据时被创建
事实上,与Kafka一起使用Spark时,从检查点恢复时,首先会产生作业。所有数据都在一个或多个批次中处理(取决于某些配置),而在web ui中,您只能看到所有使用0事件执行的恢复批次。
还有第二件事令人困惑......
是的,从网络上来说,这令人困惑。尝试计算每个批次的事件数量,打印数量
DStream.foreachRDD(println(_.count))
你会发现Spark确实处理由checkpoint创建的批处理,而在web ui中,事件为num 0。
如果您的应用程序发现在从故障中恢复后很难处理一个批次中的所有事件,那么如何控制spark创建的批次数?
尝试搜索spark.streaming.kafka.maxRatePerPartition =>使用新Kafka直接流API时从每个Kafka分区读取数据的最大速率(每秒记录数)。
MaxRatePerPartition* partitionOfKafka* YourStreamingBatchDuration * N = eventsNumToProcess
N => After recovered from checkpoint, the num of batches spark need to process.