FLink中 处理时间和事件时间的滚动窗口

ApacheFlink中的滚动窗口(TumblingWindows)原理与应用案例

滚动窗口 (Tumbling Windows)

滚动窗口原理

  • 滚动窗口分配器将每个元素分配到一个指定窗口大小的窗口中
  • 滚动窗口有一个固定的大小,并且窗口不会出现重叠,即数据也不会重复

滚动窗口特点

  • 时间对齐
  • 窗口长度固定
  • 没有重叠
    滚动窗口场景
  • 适合做BI统计等,(做每个时间段 / 计算内的聚合计算 )
  • 每个时间段 / 计算呢你的Top-N
    滚动窗口图示如下:
    在这里插入图片描述

处理时间滚动窗口案例

package 复习
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.scala.function.ProcessWindowFunction
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.api.windowing.windows.TimeWindow
import org.apache.flink.util.Collector
/*
数据类型
2022-11-21 beijing 1
Apache Flink窗口触发机制与 Watermark 紧密相关,尤其在处理基于事件时间(Event Time)的流数据时,Watermark 是保证窗口能够正确触发计算的核心机制。 ### 窗口触发时间与 Watermark 的关系 在 Flink 中,窗口的触发时间取决于 Watermark 的推进。当 Watermark 的值超过某个窗口的结束时间戳时,该窗口将被触发执行计算[^3]。例如,假设一个基于事件时间滚动窗口为 5 秒(窗口结束时间为 t+5),当 Watermark 推进到 t+5 或更高时,窗口就会被触发。这意味着系统认为所有事件时间小于等于 t+5 的数据都已到达,窗口可以安全地进行聚合计算。 ### Watermark 的工作原理 Watermark 是一种特殊的时间戳,用于表示事件时间的进度。它由数据流中的事件生成,通常通过 `assignTimestampsAndWatermarks` 方法定义。Watermark 的生成方式可以是周期性的(Periodic Watermark)或基于事件的(Punctuated Watermark)。周期性 Watermark 会按照固定频率(如每 200 毫秒)生成一个 Watermark 值,而 Punctuated Watermark 则是根据特定事件触发生成[^2]。 在数据流中,Watermark 在各个算子之间传播。对于单并行度的算子,Watermark 直接从输入传递到输出;而在多并行度的场景中,Watermark 会在各个并行子任务之间进行合并,确保整体事件时间的进度一致。这种传播机制保证了整个流处理管道中事件时间的一致性与正确性[^1]。 ### Watermark 对窗口计算的影响 Flink窗口操作依赖 Watermark 来决定何时触发计算。在事件时间语义下,窗口的触发不是基于处理时间,而是基于 Watermark 的推进。这意味着即使某些数据延迟到达,只要未超过允许的最大延迟(max allowed lateness),Flink 仍能正确处理这些迟到的数据。如果未设置允许迟到数据的处理策略,则这些数据将被视为“迟到事件”并被丢弃。 为了更好地理解,以下是一个简单的窗口处理代码示例: ```java DataStream<Event> stream = ...; stream .assignTimestampsAndWatermarks(WatermarkStrategy .<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5)) .withTimestampAssigner((event, timestamp) -> event.timestamp)) .keyBy(keySelector) .window(TumblingEventTimeWindows.of(Time.seconds(10))) .trigger(ContinuousEventTimeTrigger.of(Time.seconds(1))) .process(new MyProcessWindowFunction()); ``` 在该示例中,`forBoundedOutOfOrderness` 设置了 Watermark 的最大乱序容忍度为 5 秒,而窗口长度为 10 秒。每秒触发一次部分计算结果的输出。当 Watermark 超过窗口结束时间时,窗口将被完全触发并输出最终结果。 ### 总结 Watermark 是 Flink处理处理事件时间与乱序数据的核心机制,它决定了窗口何时触发计算。通过合理设置 Watermark 策略与窗口参数,可以确保流处理作业在面对延迟数据时依然保持准确性一致性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值