一、简介
Flink在处理无界数据流时,也可以切分数据流来得到有限的数据集进行处理,即有界流。而windows,就是它的切分方式,它会把数据流分发到有限大小的bucket(桶)种进行分析。其中,可以分为两种window类型,即时间窗口和计数窗口。
window类型 | 细分类型 | 备注 |
---|---|---|
时间窗口 | 滚动时间窗口 | 最简单的窗口类型,按照时间切分成一个一个的窗口 |
滑动时间窗口 | 它会进行滑动,每次滑动的步长可以设定,窗口之间可以有重叠 | |
会话窗口 | 前后会话相隔一定的时间,则划分一个窗口 | |
计数窗口 | 滚动计数窗口 | 达到一定数量就划分一个窗口 |
滑动计数窗口 | 滑动进行统计,比如每隔一分钟统计过去24小时购买数据 |
二、代码
package com
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.assigners.{
EventTimeSessionWindows, ProcessingTimeSessionWindows, SlidingProcessingTimeWindows, TumblingEventTimeWindows, TumblingProcessingTimeWindows}
import org.apache.flink.streaming.api.windowing.time.Time
object TumblingWindow {
def main(args: Array[String]): Unit = {
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
// receive a text-stream
val ds: DataStream[String] = env.socketTextStream("127.0.0.1", 9999)
val result: DataStream[(String, Int)] = ds.flatMap(_.split(" "))
.filter(_.nonEmpty)
.map((_, 1))
.keyBy(0)
// 滚动事件窗口(按照process-time),如果使用event-time,即TumblingEventTimeWindows,则需要指定事件时间和watermark
// .window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
// 滑动时间窗口,窗口长度为5s,每次滑动长度为3s
// .window(SlidingProcessingTimeWindows.of(Time.seconds(5), Time.seconds(3)))
// 会话窗口,两次处理时间相隔5秒以上,则不认为这是同一个窗口了
// .window(ProcessingTimeSessionWindows.withGap(Time.seconds(5)))
// 简写:滚动窗口
// .timeWindow(Time.seconds(5))
// 简写:滑动窗口
// .timeWindow(Time.seconds(5), Time.seconds(3))
// 计数窗口:滚动
// .countWindow(10)
// 计数窗口:滑动
.countWindow(10, 5)
.sum(1)
result.print()
env.execute("window demo")
}
}
使用netcat工具,windows平台使用nc -lp 9999
,linux使用nc -lk 9999
进行测试。
三、备注
flink还提供了很多窗口调用,根据需要进行使用,可以在源码种查看。