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

时间:2016-10-11 04:55:13

标签: apache-spark spark-streaming

在纱线集群上我使用kafka directstream作为输入(ex.batch时间是15s),并且想要在单独的userIds中聚合输入消息。 所以我使用有状态的流式api,例如updateStateByKeymapWithState。但是从API来源,我看到mapWithState的默认检查点持续时间是批量存在* 10(在我的情况下) 150 s),并且在kafka directstream中,每个批次(15秒)检查分区偏移量。实际上,每个dstream可以设置不同的检查点持续时间。 所以,我的问题是:

当流媒体应用程序崩溃时,我重新启动它,kafka偏移量和状态流rdd在检查点中是异步的,在这种情况下如何保持数据丢失?或者我误解了检查点机制?

1 个答案:

答案 0 :(得分:1)

  

如何保持数据丢失?

mapWithStateupdateStateByKey 等有状态流需要您提供检查点目录,因为它们是如何运作的,它们每个中间存储状态能够在崩溃时恢复状态。

除此之外,链中的每个DStream也可以自由地请求检查点,问题是"你真的需要检查其他流吗?#34;?

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