使用kstream连接时遇到问题。我要做的是从一个主题开始,我将3种不同类型的消息分离到新的流中。 然后对其中两个流进行一次内部联接,从而创建另一个流,最后我对新流和最后一个剩余流进行最后一个左联接。
联接的窗口时间为30秒。
这样做是为了过滤掉一些被其他人覆盖的消息。
我正在kubernetes上运行此应用程序,并且Pod的磁盘空间会无限期地增长,直到Pod崩溃为止。
我意识到这是因为联接将数据本地存储在tmp / kafka-streams目录中。
这些目录称为: KSTREAM-JOINTHIS ... KSTREAM-OUTEROTHER ..
其中存储来自rocksDb的sst文件,并且这些文件会无限期增长。
我的理解是,由于即时消息使用的是30秒的窗口时间,因此应在一定时间后将其冲洗掉,但不是。
我还将WINDOW_STORE_CHANGE_LOG_ADDITIONAL_RETENTION_MS_CONFIG更改为10分钟,以查看是否进行了更改(不是这种情况)。
我需要了解如何进行更改。
答案 0 :(得分:0)
窗口大小不决定您的存储要求,但决定联接的保留期。要处理无序记录,数据的存储时间应大于窗口大小(默认保留时间为1天)。
您可以通过将Materialized.as(null).withRetention(...)
传递给join(...)
运算符来减少保留时间。
在较旧的Kafka版本中,您可以通过窗口定义指定保留期,例如
JoinWindows.of(...).until(...)
。
配置WINDOW_STORE_CHANGE_LOG_ADDITIONAL_RETENTION_MS_CONFIG
配置在集群中存储数据的时间。因此,您可能也想减少它,但是这无助于减少客户端的存储需求。