Apache kafka 如何清理Kafka KStream内部变更日志和重新分区主题
卡夫卡版本1.1 我们使用Kafka KStream根据事件本身中选定的键聚合事件。下面是它的大致功能Apache kafka 如何清理Kafka KStream内部变更日志和重新分区主题,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,卡夫卡版本1.1 我们使用Kafka KStream根据事件本身中选定的键聚合事件。下面是它的大致功能 KStream[String, Event] .selectKey[String]({ (_, event) => aggregationKey(event) } .groupByKey() .aggregate( () => { Event("", "") }
KStream[String, Event]
.selectKey[String]({ (_, event) =>
aggregationKey(event)
}
.groupByKey()
.aggregate(
() => {
Event("", "")
},
(k: Any, event: Event, aggregate: Event) => aggregator(k, event, aggregate, inputTopicName),
Materialized
.as[String, Event, KeyValueStore[Bytes, Array[Byte]]]("store-name")
.withValueSerde(protoSerde)
)
.toStream
.to(outTopicName)
在“aggregator”函数中,我根据特定条件返回null base,以生成一个逻辑删除事件
卡夫卡创建了两个主题:重新分区和变更日志。在重新分区主题中,保留设置为-1。无论墓碑事件如何,这些主题都在不断增长。我找不到办法把它们清理干净
我们的要求是直截了当的:
只要满足某个键的条件,该键的聚合更改日志就没有用处。我们希望彻底永久地清除该密钥的所有事件
请就如何清理基于密钥的kstream内部主题提供建议?非常感谢。上游重新分区主题不应无限扩展:正如您注意到的,保留时间设置为
-1
(以避免数据丢失)。但是,在处理记录后,KafkaStreams会显式清除该主题
此外,如果从聚合器返回null
,则KTable
存储中的相应条目将被删除,并且一个墓碑将被发送到changelog主题并发送到下游。当然,墓碑也会首先附加到主题中,只有在代理端主题压缩运行时,旧记录才会被“垃圾收集”