我正在从事Spark有状态流工作,该工作从不同的Kafka主题读取消息,并从这些消息中聚合一些值。我的最小批量时间间隔是500ms-1s。为了争辩,让我们假设Kafka主题中的消息是用一次语义编写的。
如果检查点设置正确,我的工作将只处理一次,就可以了。但是,如果我将新版本的Spark作业投入生产,会发生什么情况,因为如果这样做,我将无法重用以前的检查点。
Spark检查点的替代方法是在Zookeeper中保持偏移量,但是如果作业失败或新版本投入生产,这将丢失一些数据。例如,消息A在间隔1中进入状态,其偏移量已提交给Zookeeper。如果在间隔2中发生故障,并且必须与消息A聚合的消息B在间隔3中,则在新运行中,我的Spark作业将丢失数据。