繁体   English   中英

Kafka StreamsException TimeoutException:即将到期的 N 条记录实现 KTable

[英]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 10000
  • linger.ms 1000
  • request.timeout.ms 300000
  • max.block.ms 300000
  • retry.backoff.ms 1000
  • replication.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM