Flink中基于事件和处理时间的滑动窗口

本文介绍了滑动窗口的概念,包括窗口长度固定和可能的重叠,以及在Flink中的应用,如事件时间和处理时间窗口。通过一个实例展示了如何使用Flink的SlidingEventTimeWindows和SlidingProcessingTimeWindows进行数据处理。
摘要由CSDN通过智能技术生成

滑动窗口原理

  • 滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成
  • 滑动窗口分配器将元素分配到固定长度的窗口中,与滚动窗口类似
  • 窗口的大小由窗口大小参数来配置
  • 窗口滑动参数控制滑动窗口开始的频率
  • 滑动窗口如果滑动参数小于窗口大小的话,窗口时可以重叠的,在这种情况下,元素会被分配到多个窗口中
    例如:
    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")
  }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值