我当前正在处理由Flink SQL中的连续查询引起的OOM问题(例如,没有窗口的GROUP BY子句)。在研究Flink的Runtime模块之后,我发现随着时间的流逝,HeapKeyedStateBackend中的StateTable变得越来越大,因为有太多潜在的键要放入内存中(而GC占用了大部分CPU时间),最终使作业甚至整个JVM崩溃。
因此,我现在正在考虑实现一个“可溢出”状态表,当堆内存将要耗尽时,该表可以将键和值一起溢出到磁盘(或诸如RocksDB之类的StateBackends)中。而且,当内存压力减轻时,可以将这些条目放回去。
我不确定Flink社区是否有一些计划来解决由堆中的大量键和状态引起的OOM问题(除了单独使用RocksDB之外,因为当堆内存足够时吞吐量会相当慢) ,以及我的计划是否有严重的缺陷,是否值得这样做,例如使检查点过程变得更加不一致,还是大大降低了吞吐量等?
希望收到任何反馈,并在此先感谢您:)