【问题标题】:Kafka Streams Punctuation Timestamp ahead of context timestampsKafka Streams 标点时间戳在上下文时间戳之前
【发布时间】:2021-11-01 10:55:03
【问题描述】:

我们正在使用使用 STREAM_TIME 标点符号的自定义转换器。当我记录来自转换函数的消息时,来自 context.timestamp() 的流时间按预期显示 - 基于使用时间戳提取器派生的数据的合理日期。

现在 - 在过去的某个时候,我们收到了一些恶意消息,将流时间提前到了 2036 年。我们现在已经停止了这些上游,并重新启动了 Kafka Streams。

当流启动时,标点符号会在受影响任务的启动时运行,但会显示 2036 的时间戳 - 即使消息通过转换,context.timestamp 仍会显示有效日期。因此,流永远不会前进标点符号再也不会跑了。下面是我如何在标点符号中导出时间戳的示例...

 override def punctuate(timestamp: Long) : Unit = {

      val currentTimeStamp = timestamp

【问题讨论】:

  • 一些日志:当标点符号运行时(仅在启动时,日志显示时间戳) - 流排序标点符号:为任务 4_30 执行:当前:2086007292029 但是,在运行相同的转换函数中任务id,时间戳完全不同-stream ts=1635778876000
  • 标点符号似乎在 kafka 流启动时运行,甚至在它处理任何消息之前 - 但它的流时间为 2086007292029。这怎么可能?有没有我找不到的状态?我们也在启动流之前运行 cleanUp 函数...

标签: apache-kafka apache-kafka-streams


【解决方案1】:

好的——在完成了我应该做的事情并仔细研究了 Kafka Streams 代码之后,很明显分区的流时间保存在元数据中,元数据保存在 _consumer_offsets 中。应用程序重置工具是“重置”这些数据的方法。

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多