减少广播状态检查点大小的最佳方法



我有相当大的广播状态(序列化为状态时约为62MB)。我注意到,在检查点期间,我的操作符的每个实例都保存了这个状态的副本。并行度为400,即24gb的检查点状态,其中大部分是重复的。

这与文档中重要注意事项的描述相匹配。另一方面,反压下的检查点显示:

广播分区通常用于实现广播状态,该状态应该在所有操作符之间相等。Flink通过从有状态操作符的子任务0中检查点状态的单个副本来实现广播状态。在恢复时,我们将该副本发送给所有操作符。因此,可能会发生这样的情况,操作符将获得应用于记录的更改的状态,该记录将很快从其检查点通道中消费。

关于"检查点子任务0的状态的单个副本"的部分;与我所看到的不符,希望有人能澄清。

不管……有什么典型的解决方法吗?例如,我可以将tm设置为一个插槽(即使它们有8个内核),然后使用线程池来处理传入的非广播元素。这将使运算符的并行度减少8倍。假设我处理并发问题(线程在更新状态时访问状态),还有什么其他问题?例如,集电极是否可以保存;然后由线程安全地异步调用?我没有水印,但想知道检查点障碍之类的东西。

或者我可以放弃使用广播流,并自己复制数据(使用精心构造的键),但这也是一个直升机特技。

关于"检查只指向子任务0的一个状态副本"的部分;是不正确的(我与那句话的作者核实了这一点)。在BroadcastState的当前实现中,所有操作符都快照自己的状态。

恐怕这无助于回答你真正的问题,但希望能澄清情况。

相关内容

最新更新