滑动窗口原理
- 滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成
- 滑动窗口分配器将元素分配到固定长度的窗口中,与滚动窗口类似
- 窗口的大小由窗口大小参数来配置
- 窗口滑动参数控制滑动窗口开始的频率
- 滑动窗口如果滑动参数小于窗口大小的话,窗口时可以重叠的,在这种情况下,元素会被分配到多个窗口中
例如:
10分钟的窗口和5分钟的滑动
每个窗口中包含着上个10分钟产生的后5分钟的数据
滑动窗口的特点
- 窗口长度固定
- 可以有重叠
滑动窗口适用场景
-对最近一个时间段/计算内的统计(求某接口最近5min的失败了来决定是否要报警)
最近多长时间 是滑动窗口要和滚动窗口区分
滑动窗口示例图如下:

事件和处理时间滑动窗口案例
package 复习
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
import org.apache.flink.streaming.api.scala.function.ProcessWindowFunction
import org.apache.flink.streaming.api.windowing.assigners.{SlidingEventTimeWindows, SlidingProcessingTimeWindows, TumblingEventTimeWindows}
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.api.windowing.windows.TimeWindow
import org.apache.flink.util.Collector
object Sliding_Windows {
def main(args: Array[String]): Unit = {
/*
2022-5-18 beijing 1648806746000
2022-5-18 beijing 1648806749000
2022-5-18 beijing 1648806751000
2022-5-18 beijing 1648806752000
2022-5-18 beijing 1648806757000
*/
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) // 注意:一定设置并行度,否则需要大量数据才能看到效果
val ds = env.socketTextStream("localhost", 6666)
.map(x => {
val fields: Array[String] = x.split(" ")
val date = fields(0).trim
val province = fields(1)
val ts = fields(2).trim.toLong
(date + "_" + province, ts)
})
// 后续会说,这里主要测试事件时间窗口
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[(String, Long)](Time.seconds(0)) {
override def extractTimestamp(t: (String, Long)): Long = t._2 // 提取事件时间
})
.keyBy(x => x._1)
// .window(SlidingEventTimeWindows.of(Time.seconds(10),Time.seconds(5))) // 事件时间滑动窗口 十秒窗口 滑动大小为5秒
.window(SlidingProcessingTimeWindows.of(Time.seconds(10),Time.seconds(5))) // 处理时间滚动窗口
.process(new ProcessWindowFunction[(String, Long), String, String, TimeWindow] {
override def process(key: String, context: Context, elements: Iterable[(String, Long)], out: Collector[String]): Unit = {
val start: Long = context.window.getStart // 获取窗口的开始时间
val end: Long = context.window.getEnd // 获取窗口的结束时间
out.collect(s"""窗口的开始时间:$start,窗口的结束时间:$end,窗口的数据条数:${elements.size},数据:${elements}""".stripMargin)
}
})
.print()
env.execute("test05")
}
}
本文介绍了滑动窗口的概念,包括窗口长度固定和可能的重叠,以及在Flink中的应用,如事件时间和处理时间窗口。通过一个实例展示了如何使用Flink的SlidingEventTimeWindows和SlidingProcessingTimeWindows进行数据处理。
1493

被折叠的 条评论
为什么被折叠?



