Flink Keyed State的优化与实践

💡 原文中文,约4600字,阅读约需11分钟。
📝

内容提要

Flink SQL在双流join场景中,当State的存储达到TB级别后,会发现State的scan/next/readNull请求RT会变得较高。通过使用RocksDB的BlobDB方案,可以大大降低IO和CPU毛刺。经过适配并在大State中开启KV分离后,观察RocksDB日志发现SST的文件大小急剧下降,State Key也全聚集在了L0和L1这两层中。最后的效果是ReadNull耗时全降到了百微妙左右,scan和next的RT 99线也降到了1毫秒左右。

Q&A

Flink SQL中的双流Join是什么?

双流Join是指在Flink SQL中对两个流进行连接操作,分为Regular Join和Interval Join,后者的State Key较小但Value较大。

如何优化Flink Keyed State的读性能?

通过使用RocksDB的BlobDB方案,可以实现KV分离,从而降低SST文件大小和层级,优化读性能。

RocksDB的BlobDB方案有什么优势?

BlobDB方案通过KV分离,将大Value写入Blob文件中,减少SST文件的大小和层级,从而降低读性能的影响。

开启KV分离后Flink的性能变化如何?

开启KV分离后,ReadNull耗时降至百微秒,scan和next的RT降至1毫秒,CPU毛刺降低50%。

Flink中State的存储问题是什么?

当State存储达到TB级别时,scan/next/readNull请求的RT会变高,影响整体性能。

未来Flink Keyed State的优化方向有哪些?

未来的优化方向包括升级RocksDB版本、降低compaction速率和默认开启KV分离。

🏷️

标签

➡️

继续阅读