apache-kafka - 可能由于与 ktable 相关的状态存储而导致内存不足异常
问题描述
我们有一个kstreams
应用程序进行kstream-kstable
内部连接。这两个主题都是高容量的,每个主题有 256 个分区。kstreams
应用程序现在部署在 8 个节点上,每个节点有 8 GB 堆。我们看到堆内存不断增长,最终发生OOM。我无法获得堆转储,因为它在容器中运行,当这种情况发生时会被杀死。但是,我尝试了一些方法来获得信心,它与状态存储/ktable 相关的东西有关。没有下面RocksDBConfigSetter
的内存会很快用完,但是下面的内存会在一定程度上减慢。需要一些指导以进一步进行,谢谢
我添加了以下3个属性,
properties.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 1 * 1024L);
properties.put(StreamsConfig.ROCKSDB_CONFIG_SETTER_CLASS_CONFIG, CustomRocksDBConfig.class);
properties.put(StreamsConfig.TOPOLOGY_OPTIMIZATION, StreamsConfig.OPTIMIZE);
public static class CustomRocksDBConfig implements RocksDBConfigSetter {
private org.rocksdb.Cache cache = new org.rocksdb.LRUCache(1 * 1024L * 1024L);
@Override
public void setConfig(final String storeName, final Options options, final Map<String, Object> configs) {
log.info("In CustomRocksDBConfig");
BlockBasedTableConfig tableConfig = (BlockBasedTableConfig) options.tableFormatConfig();
tableConfig.setBlockCache(cache);
tableConfig.setBlockSize(1 * 1024L);
tableConfig.setCacheIndexAndFilterBlocks(true);
options.setTableFormatConfig(tableConfig);
options.setMaxWriteBufferNumber(2);
}
@Override
public void close(final String storeName, final Options options) {
cache.close();
}
解决方案
您可以尝试在一个节点上的所有 RocksDB 实例中限制 RocksDB 的内存使用量。为此,您必须将 RocksDB 配置为缓存块缓存中的索引和过滤块,通过共享限制 memtable 内存WriteBufferManager
并将其内存与块缓存进行计数,然后将相同的Cache
对象传递给每个实例。您可以在下面找到更多详细信息和示例配置
https://kafka.apache.org/28/documentation/streams/developer-guide/memory-mgmt.html#rocksdb
通过这样的设置,您可以为单个实例上所有 RocksDB 状态存储使用的总堆指定一个软上限(示例配置中的 TOTAL_OFF_HEAP_MEMORY),然后指定该堆的多少用于写入和读取状态存储在一个节点上(分别在示例配置中为 TOTAL_MEMTABLE_MEMORY 和 INDEX_FILTER_BLOCK_RATIO)。
由于所有值都是特定于应用程序和工作负载的,因此您需要对它们进行试验并使用Kafka Streams 提供的指标监控 RocksDB 状态存储。
有关如何在 Kafka Streams 中处理 RocksDB 问题的指南,请参见:
https://www.confluent.io/blog/how-to-tune-rocksdb-kafka-streams-state-stores-performance/
特别是对于您的情况,以下部分可能会很有趣:
推荐阅读
- javascript - 开玩笑测试,在第一次调用时调用实际实现,模拟其余部分
- javascript - 如果特定页面结构上的文本为空,则隐藏按钮
- arrays - 使用段树查找范围内第一个和最后一个元素的乘积之和,第二个和倒数第二个等等
- ibm-cloud - IBM Watson Assistant:如何从选项响应中设置上下文变量?
- azure - 有没有一种方法可以在用户单击创建之前通过 ARM 模板为用户创建存储帐户?
- javascript - JS 返回语法看起来很奇怪
- angular - 覆盖 routerLink 和 router.navigate
- python - How would I check for and manipulate matching value within all rows and columns of 2d list?
- javascript - How to use slice method in data-table, vue
- r - How to create a logical vector that indicates whether the values in two columns are the same across categorical factors in R?