首页 > 解决方案 > 可能由于与 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();
        } 

标签: apache-kafkaapache-kafka-streamsktable

解决方案


您可以尝试在一个节点上的所有 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/

特别是对于您的情况,以下部分可能会很有趣:

https://www.confluent.io/blog/how-to-tune-rocksdb-kafka-streams-state-stores-performance/#high-memory-usage


推荐阅读