在纱线集群上我使用kafka directstream作为输入(ex.batch时间是15s),并且想要在单独的userIds中聚合输入消息。
所以我使用有状态的流式api,例如updateStateByKey
或mapWithState
。但是从API来源,我看到mapWithState
的默认检查点持续时间是批量存在* 10(在我的情况下) 150 s),并且在kafka directstream中,每个批次(15秒)检查分区偏移量。实际上,每个dstream可以设置不同的检查点持续时间。
所以,我的问题是:
当流媒体应用程序崩溃时,我重新启动它,kafka偏移量和状态流rdd在检查点中是异步的,在这种情况下如何保持数据丢失?或者我误解了检查点机制?
答案 0 :(得分:1)
如何保持数据丢失?
mapWithState
或updateStateByKey
等有状态流需要您提供检查点目录,因为它们是如何运作的,它们每个中间存储状态能够在崩溃时恢复状态。
除此之外,链中的每个DStream
也可以自由地请求检查点,问题是"你真的需要检查其他流吗?#34;?
如果应用程序崩溃,Spark会将所有状态RDD存储在检查点内,然后将其带回内存,因此您的数据与上次点火检查点一样好。我要记住的一件事是,如果您更改了应用程序代码,您无法从检查点恢复状态,则必须将其删除。这意味着,如果您需要进行版本升级,那么以前存储在该状态中的所有数据都将消失,除非您以允许版本控制的方式手动保存它。