Apache kafka 我可以清空当地的卡夫卡州立商店吗

Apache kafka 我可以清空当地的卡夫卡州立商店吗,apache-kafka,stream,apache-kafka-streams,rocksdb,Apache Kafka,Stream,Apache Kafka Streams,Rocksdb,目前我有3个kafka代理,有150个分区。 我还有3个消费者,每个消费者被分配到一组分区。 每个消费者都有自己的本地rocksdb州立商店。在grpc调用期间调用此内存键值存储。在重新平衡期间(如果消费者消失),数据将写入其他消费者的本地存储中 如果消费者运行了大约2周,则服务似乎内存不足。 是否有解决本地存储增长过快的方法?我们可以删除不再需要的分区的数据吗?或者,是否有方法在消费者恢复后删除存储的数据?您可以使用cleanUp();方法启动或关闭Kafka流以清理状态存储 清理() 通过删

目前我有3个kafka代理,有150个分区。 我还有3个消费者,每个消费者被分配到一组分区。 每个消费者都有自己的本地rocksdb州立商店。在grpc调用期间调用此内存键值存储。在重新平衡期间(如果消费者消失),数据将写入其他消费者的本地存储中

如果消费者运行了大约2周,则服务似乎内存不足。 是否有解决本地存储增长过快的方法?我们可以删除不再需要的分区的数据吗?或者,是否有方法在消费者恢复后删除存储的数据?

您可以使用cleanUp();方法启动或关闭Kafka流以清理状态存储

清理()

通过删除与本地StateStore相关的所有数据来清理本地StateStore 只能在此之前调用 KafkaStreams实例是在中通过调用start()方法或 通过调用close()方法关闭实例后

注意:为了避免相应的恢复开销,您不应该调用 默认情况下为cleanUp(),但仅当确实需要时。否则,您将清除本地状态并触发昂贵的状态恢复。你 不会丢失数据,程序仍然正确,但您可以 显著降低启动速度(取决于您所在州的大小)

如果您希望在Kafka Stream的生命周期中从state store中删除,那么您完全可以从state store中删除它在rocks B中的所有地图存储集合

假设您使用的是Kafka流处理器

KeyValueStore<String, String> dsStore=(KeyValueStore<String, String>) context.getStateStore("localstorename");
KeyValueIterator<String, String> iter = this.dsStore.all();
                while (iter.hasNext()) {
                KeyValue<String, String> entry = iter.next();
                dsStore.delete(entry.key);
                }
KeyValueStore dsStore=(KeyValueStore)context.getStateStore(“localstorename”);
KeyValueIterator iter=this.dsStore.all();
while(iter.hasNext()){
KeyValue entry=iter.next();
dsStore.delete(entry.key);
}

有什么具体原因吗?我认为最好在流重新启动之前使用cleanup来清理本地状态存储。默认情况下,您不应该使用
cleanup
,但只有在您确实需要的情况下才应该使用。否则,您将清除本地状态并触发昂贵的状态恢复。您不会丢失数据,程序仍然正确,但可能会显著降低启动速度(取决于您的状态大小):感谢更新的响应…这是考虑使用cleanUp()之前的关键点
KeyValueStore<String, String> dsStore=(KeyValueStore<String, String>) context.getStateStore("localstorename");
KeyValueIterator<String, String> iter = this.dsStore.all();
                while (iter.hasNext()) {
                KeyValue<String, String> entry = iter.next();
                dsStore.delete(entry.key);
                }