1

我正在运行一个(相对)简单的 KStreams 应用程序:

流->按键聚合->过滤器->foreach

它在具有 32Gb / 8CPU 的 AWS EC2 上每分钟处理约 20 万条记录

在启动它的 10 分钟内,内存使用量超过 40%。不久之后(通常少于 15 分钟),操作系统将 OOM 杀死它。

配置:

config.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, "450000");
config.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 250);
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
config.put(StreamsConfig.TIMESTAMP_EXTRACTOR_CLASS_CONFIG, EventTimeExtractor.class.getName());

config.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");
config.put(StreamsConfig.NUM_STANDBY_REPLICAS_CONFIG, "2");

聚合步骤:

KTable<Windowed<String>, String> ktAgg = sourceStream.groupByKey().aggregate(
        String::new,
        new Aggregate(),
        TimeWindows.of(20 * 60 * 1000L).advanceBy(5 * 60 * 1000L).until(40 * 60 * 1000L),
        stringSerde, "table_stream");

使用 Kafka 0.10.1.1

关于在哪里寻找罪魁祸首的建议?


边注:

我尝试使用NewRelic javaagent 来检测这个应用程序。当我用它运行它时-XX:+useG1GC,标准“使用大量内存然后被杀死”但是当我删除 G1GC 参数时,进程将系统负载运行到 > 21。我不得不自己杀死那个。

NewRelic 的输出没有显示出任何令人发指的内存管理。

4

0 回答 0