Kafka kstream-kstream伴随着滑动窗口内存使用量的增长一直持续到OOM

时间:2019-03-12 10:38:09

标签: java apache-kafka apache-kafka-streams rocksdb rocksdb-java

使用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分钟,以查看是否进行了更改(不是这种情况)。

我需要了解如何进行更改。

1 个答案:

答案 0 :(得分:0)

窗口大小不决定您的存储要求,但决定联接的保留期。要处理无序记录,数据的存储时间应大于窗口大小(默认保留时间为1天)。

您可以通过将Materialized.as(null).withRetention(...)传递给join(...)运算符来减少保留时间。

  

在较旧的Kafka版本中,您可以通过窗口定义指定保留期,例如JoinWindows.of(...).until(...)

配置WINDOW_STORE_CHANGE_LOG_ADDITIONAL_RETENTION_MS_CONFIG配置在集群中存储数据的时间。因此,您可能也想减少它,但是这无助于减少客户端的存储需求。