【问题标题】:How flink deal with lateness when timestamp is assigned at source?在源头分配时间戳时,flink如何处理延迟?
【发布时间】:2021-05-28 13:13:31
【问题描述】:

目前我的理解是,在 Flink 中处理延迟数据有 3 种方式:

  • 删除迟到的事件(这是事件时间窗口操作符的默认行为。因此,迟到的元素不会创建新窗口。)

  • 重定向迟到的事件(迟到的事件也可以使用侧输出功能重定向到另一个数据流)

  • 通过包含延迟事件更新结果(重新计算不完整的结果并发出更新)

我不太了解非窗口运算符的延迟事件会发生什么,尤其是在源处分配时间戳时。 这里我有一个 FlinkKafkaConsumer :

new FlinkKafkaConsumer(
          liveTopic,
          deserializer,
          config.toProps
        ).setStartFromTimestamp(startOffsetTimestamp)
          .assignTimestampsAndWatermarks(
            WatermarkStrategy
              .forBoundedOutOfOrderness[String](Duration.ofSeconds(20))
          )

如果我的 Kafka 分区中的某些数据出现乱序,比如记录附加的时间戳晚 1 分钟,这些数据会在 Flink 使用时被丢弃吗? 我可以配置某种 allowedLatness 吗(例如使用窗口运算符)?

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    唯一删除延迟事件的操作员是那些必须根据时间决定如何处理每个事件的操作员。因此,默认情况下,基于事件时间的窗口和 CEP 会丢弃迟到的事件(CEP 这样做是因为它必须首先对事件流进行基于时间的排序,而迟到的事件已经错过了被排序到位的机会)。在这两种情况下,这些 API 都会提供延迟事件流作为辅助输出通道。

    Flink SQL 的时间运算符也会丢弃延迟事件。到目前为止,Table/SQL 还没有提供任何方法来捕获或容纳那些迟到的事件(不求助于使用 DataStream API)。

    但所有其他操作员只是简单地操作事件,而不注意它们的迟到。在ProcessFunction 中,您可以检查时间戳并将其与当前水印进行比较,然后自行决定如何处理延迟事件。

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多