使用 Kafka Direct InputDstream 和有状态流转换时如何理解检查点恢复?

How can I understand check point recorvery when using Kafka Direct InputDstream and stateful stream transformation?

在 yarn-cluster 上,我使用 kafka directstream 作为输入(ex.batch 时间是 15s),并希望在单独的 userIds 中聚合输入消息。 所以我使用状态流 api,如 updateStateByKeymapWithState。但是从 api 来源,我看到 mapWithState 的默认检查点持续时间是 batchduration * 10(在我的例子中是 150 秒),而在 kafka directstream 中,分区偏移量在每个批次(15 秒)处都有检查点。实际上,每个 dstream 都可以设置不同的检查点持续时间。 所以,我的问题是:

当streaming app crash时,我重启了它,kafka offset和state stream rdd在checkpoint中是异步的,在这种情况下如何保持数据不丢失?还是我对checkpoint机制理解有误?

How can I keep no data lose?

有状态的流,例如 mapWithStateupdateStateByKey 要求 您提供一个检查点目录,因为这是它们运行方式的一部分,它们会存储状态中间能够在崩溃时恢复状态。

除此之外,链中的每个 DStream 也可以自由请求检查点,问题是 "do you really need to checkpoint other streams"?

如果应用程序崩溃,Spark 会获取存储在检查点内的所有状态 RDD,然后将其带回内存,因此您的数据与上次 spark 在那里检查点时一样好。我要记住的一件事是,如果您更改应用程序代码,您无法从检查点恢复状态,您必须将其删除。这意味着如果您需要进行版本升级,那么之前存储在状态中的所有数据都将消失,除非您以允许版本控制的方式手动保存它。