【问题标题】:Apache Flink Is Windowing dependent on Timestamp assignment of EventTime EventsApache Flink 窗口化依赖于 EventTime 事件的时间戳分配
【发布时间】:2021-12-16 14:43:24
【问题描述】:

我是 apache flink 的新手,正在尝试了解 flink 如何处理 EventTime 和 Windowing 的概念。

所以这是我的场景:

  1. 我有一个程序作为线程运行并创建一个包含 3 个文件的文件 每秒字段,其中第三个字段是时间戳。

  2. 虽然每 5 秒我会在新创建的文件中输入一个较旧的时间戳(你可以说是 t-5),但会有一些调整。

  3. 现在我运行读取上述 3 个字段的流处理作业 成一个元组。

  4. 现在我已经为水印和时间戳生成定义了以下代码:

       WatermarkStrategy
      .<Tuple3<String, Integer, Long>>forBoundedOutOfOrderness(Duration.ofSeconds(4))
      .withTimestampAssigner((event, timestamp) -> event.f2);
    
    
  5. 然后我使用以下代码对上述内容进行窗口化并尝试获取聚合:

     withTimestampsAndWatermarks
            .keyBy(0)
            .window(TumblingEventTimeWindows.of(Time.milliseconds(4000)))
            .reduce((x,y) -> new Tuple3<String, Integer, Long>(x.f0, x.f1 + y.f1,y.f2))
    
  6. 很明显,我正在尝试聚合每个字段中的数字。(更多上下文,我要聚合的字段(f2)都是 1)

因此我有以下问题:

  1. 即窗口只有 4 秒宽,每五个条目 一个较旧的时间戳,所以我期待下一个窗口有 较少的计数。我的理解有错吗?
  2. 如果我的理解是正确的 - 我在并行运行两个程序时看不到任何聚合,我的代码有问题吗?
  3. 另一个困扰我的问题是窗口开始时间和结束时间真正依赖于哪些字段或哪些参数?是从事件中提取的时间戳还是从处理时间中提取的时间戳

【问题讨论】:

    标签: apache-flink


    【解决方案1】:

    您必须配置allowed latenesshttps://nightlies.apache.org/flink/flink-docs-release-1.2/dev/windows.html#allowed-lateness。如果没有配置,Flink 会丢弃迟到的消息。所以对于下一个窗口,元素会比上一个窗口少。

    通过以下计算分配窗口:

    return timestamp - (timestamp - offset + windowSize) % windowSize
    

    在您的情况下,偏移量为 0(默认值)。对于事件时间窗口,timestamp 是事件时间。对于处理时间窗口,timestamp 是来自 Flink 算子的处理时间。例如。如果windowSize=3,timestamp=122,则元素将被分配到窗口[120, 123)。

    【讨论】:

    • 一个解决方案是增加传递给有界无序策略的持续时间,以便没有任何延迟事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多