我有一个这样的管道:
env.addSource(kafkaConsumer, name_source)
.keyBy { value -> value.f0 }
.window(EventTimeSessionWindows.withGap(Time.seconds(2)))
.process(MyProcessor())
.addSink(kafkaProducer)
这些键保证在当前正在处理的数据中是唯一的。 因此,我希望状态大小不会超过 2 秒的数据增长。
但是,我注意到状态大小在过去一天中一直在稳步增长(自应用部署以来)。
这是 flink 中的错误吗?
在 aws kinesis 数据分析中使用 flink 1.11.2。
答案 0 :(得分:0)
Kinesis Data Analytics 始终使用 RocksDB 作为其状态后端。使用 RocksDB,死状态不会立即清除,它只是用墓碑标记,然后被压缩。我不确定 KDA 如何配置 RocksDB 压缩,但通常它会在级别达到特定大小时完成 - 我怀疑您的状态大小仍然足够小以至于没有发生压缩。
使用增量检查点(这就是 KDA 所做的),检查点是通过复制 RocksDB 的 SST 文件来完成的——在您的情况下,这些文件可能充满了陈旧数据。如果您让它运行足够长的时间,您最终应该会看到检查点大小在压缩完成后显着下降。