![](/img/trans.png)
[英]Kafka streaming - TimeoutException: Expiring * record(s) for TOPIC:* ms has passed since batch creation
[英]Kafka StreamsException TimeoutException: Expiring N record(s) materializing KTable
我的流应用程序只是从记录主题中具体化 KTable。 主题中有 100K 条记录,没有问题。 但是,主题中有 1500 万条记录,一旦我们获得几百万条记录,实例就会崩溃,并出现如下异常:
线程“Companies-de1f21f9-b445-449e-a59b-5e0cecfa54d1-StreamThread-1” org.apache.kafka.streams.errors.StreamsException 中的异常:任务 [0_0] 由于先前记录(时间戳 160651527)捕获的错误而中止发送到主题 Companies-companies.read-changelog 由于 org.apache.kafka.common.errors.TimeoutException: Expiring 40 record(s) for Companies-companies.read-changelog-0:120001 ms 自批量创建以来已经过去]
这是一个 Gist,其中包含我们正在运行的服务的详细示例。
令我感到困惑的是,我的流应用程序崩溃(如下)的错误是引用了一个生产者过载,但是,该服务只是实现了一个 KTable。
streamsBuilder
.stream(egressTopic, Consumed.with(Serdes.String(), companySerde))
.toTable(Materialized.<String, Company, KeyValueStore<Bytes, byte[]>>as(companyKTableName)
.withKeySerde(Serdes.String())
.withValueSerde(companySerde));
我已经调整过的属性试图在名义上运行:
batch.size
10000linger.ms
1000request.timeout.ms
300000max.block.ms
300000retry.backoff.ms
1000replication.factor
3每个表都由容错的变更日志主题支持。 因此,每次写入KTable
也是写入相应的KTable
日志主题。
如果您输入的主题配置了日志压缩,您可以将程序重写为
streamsBuilder.table(
egressTopic,
Materialized.<String, Company, KeyValueStore<Bytes, byte[]>>as(companyKTableName)
.withKeySerde(Serdes.String())
.withValueSerde(companySerde)
);
此外,您启用topology.optimization="all"
:对于这种情况,输入主题将被重新使用更改日志来恢复状态,并且不会创建其他更改日志主题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.