apache-kafka - StreamsException : Extracted timestamp value is negative, 这是不允许的

标签 apache-kafka apache-kafka-streams

这可能是 Error in Kafka Streams using kafka-node - negative timestamp 的副本,但肯定不是。我的 Kafka Streams 应用程序对每条消息执行一些转换逻辑并将其转发到新主题。应用程序中没有基于时间的聚合/处理,因此无需使用任何自定义时间戳提取器。这个应用程序运行了好几天,但突然间应用程序抛出了一个负面的时间戳异常。

Exception in thread "StreamThread-4" org.apache.kafka.streams.errors.StreamsException: Extracted timestamp value is negative, which is not allowed.

从所有 StreamThreads(总共 10 个)抛出这个异常后,应用程序有点被卡住,因为流上几个小时没有进一步的进展。之后没有抛出异常。当我重新启动应用程序时,它开始只处理新来的消息。

现在的问题是,中间的那些消息(在抛出异常之后和重新启动应用程序之前)发生了什么。万一那些丢失的消息没有嵌入的时间戳(极不可能,因为代理和生产者没有发生任何变化),应用程序不应该为每个这样的消息抛出异常吗?或者是不是应用程序在第一次检测到消息中的负时间戳时停止流进度?有没有办法处理这种情况,即使在检测到任何负时间戳后,应用程序也可以推进流?我的应用程序使用 Kafka Streams 库版本 0.10.0.1-cp1。

注意:我可以轻松地建立一个自定义时间戳提取器,它可以检查每条消息中的负时间戳,但这对我的应用程序来说是很多不必要的开销。我想了解的是为什么在检测到带有负时间戳的消息后流没有进展。

最佳答案

即使您没有任何基于时间的运算符,Kafka Streams 应用程序也会检查从时间戳提取器返回的时间戳是否有效,因为时间戳用于确定来自不同分区的记录的处理顺序,以确保记录按顺序处理并且所有分区以基于时间的对齐方式消耗。

如果检测到负时间戳,则应用程序(或实际上相应的线程)将死亡。不幸的是,目前无法从此类异常中恢复,您需要重新启动应用程序。另请参阅 Confluent 常见问题解答:http://docs.confluent.io/3.1.1/streams/faq.html#invalid-timestamp-exception

如果您的应用程序死掉并且您重新启动它,它将从它停止的地方继续处理。不幸的是,在卡夫卡0.10.0.1有一个错误(在即将发布的版本 0.10.2 中修复)并且在失败的情况下可能会提交不正确的偏移量并且应用程序“跳过”一些记录。我假设这发生在您的情况下,如果您只有一些带有无效时间戳的记录,则可能会跳过这些记录,从而允许您的应用程序在重新启动后恢复。这种行为实际上是一个错误——如果没有这个错误,Kafka Stream 会尝试一次又一次地处理那些具有无效时间戳的记录,并且每次都失败,直到您提供自定义时间戳提取器,通过返回有效时间戳来解决问题。

如何修复:

正确的解决方法是提供一个从不返回无效(即负)时间戳的自定义时间戳提取器。

我无法解释为什么你得到了无效的时间戳......这很奇怪,你可能想调查你的生产者设置并试图弄清楚你的生产者是否有可能放置无效的时间戳(即使这不太可能 - - 我不知道问题的根本原因可能是什么)。

补充说明:

在下一个版本 ( 0.10.2 ) 中,处理无效时间戳得到简化,并且 Kafka Streams 提供了更多内置时间戳提取器,以不同方式处理具有无效时间戳的记录。例如,这允许您自动跳过时间戳无效的记录,而不是引发错误(当前行为)。有关更多详细信息,请参阅 KIP-93:https://cwiki.apache.org/confluence/display/KAFKA/KIP-93%3A+Improve+invalid+timestamp+handling+in+Kafka+Streams

关于apache-kafka - StreamsException : Extracted timestamp value is negative, 这是不允许的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41342698/

相关文章:

java - Kafka 2.1.0 Java 消费者与 Scala 消费者

junit - 如何实例化用于 junit 测试的模拟 Kafka 主题?

apache-kafka - 带有窗口的 Kafka Streams 拓扑不会触发状态更改

unit-testing - Kafka Streams 测试 : java. util.NoSuchElementException:未初始化的主题: "output_topic_name"

java - 使用 Kafka Streams 处理复杂的 Avro 消息

apache-kafka - 与 KafkaStreams 的窗口结束外连接

hadoop - 云端大数据(Azure)

java - 如何忽略来自 Kafka 主题的未提交消息

java - 卡夫卡消费者: can onPartitionsRevoked and onPartitionsAssigned callbacks be executed inside one poll() call?

java - KafkaStreams serde异常