我正在运行一个(相对)简单的 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 的输出没有显示出任何令人发指的内存管理。