Flink 窗口
Flink作为流计算引擎,主要用来处理无界数据流。数据源源不断、无穷无尽。通过将无限数据切割成有限的“数据块”进行处理,就有“窗口”的概念。
在Flink中,窗口可以把流切割成有限大小的多个“存储桶”,每个数据都会分发的对应的桶中。当到达窗口结束时间时,就会对每个桶中收集数据进行计算处理。
窗口不是静态准备好的,是动态创建的——有数据到达时才会创建对应窗口。窗口结束时间时,窗口会触发计算并关闭。
窗口的分类
按照驱动类型分:
- 时间窗口:以时间点来定义窗口的开始和结束,到达结束时间时,窗口不再收集数据,触发计算输出结果。
- 计数窗口:基于元素个数截取数据,到达固定个数触发计算关闭窗口。
窗口分配规则分类:
- 滚动窗口:窗口之间没有重叠,也没有间隔。每个数据被分配到一个窗口,而且只属于一个窗口。
- 滑动窗口:除窗口大小外,还有滑动步长概念(代表计算频率)。数据可能被分配到多个窗口中。
- 会话窗口:长 度不固定,起始时间和结束时间也不固定,各分区之间没有关联,窗口之间一定不重叠。
- 全局窗口:相同key的所有数据分配到同一窗口,窗口没有结束,默认不会触发计算。
窗口API
- 按键分区窗口(Keyed Windows)
stream.keyBy(...).window(...)
- 非按键分区
stream.windowAll(...)
没有进行 keyBy 则原始的 DataStream 不会分多条逻辑流。窗口只有一个task执行,并行度为1。
代码中窗口API调用
stream.keyBy(<key selector>).window(<window assigner>).aggregate(<window function>)
窗口分配器
定义窗口分配器是构建窗口算子的第一步,作用是定义数据应该被分配到哪个窗口。(指定窗口的类型)
定义方式
stream.keyBy(...).window(< WindowAssigner >) //返回WindowsStream
stream.windowAll(< WindowAssigner >) //返回AllWindowedStream
时间窗口
// 滚动处理时间窗口
stream.keyBy(...).window(TumblingProcessingTimeWindows.of(Time.second(5))).aggregate(...)
// 滑动处理时间窗口
stream.keyBy(...).window(SlidingProcessingTimeWindows.of(Time.seconds(10))).aggregate(...)
// 处理时间会话窗口
stream.keyBy(...).window(ProcessingTimeSessionWindows.withGap(Time.seconds(10))).aggregate(...)
// 滚动事件时间窗口
stream.keyBy(...).window(TumblingEventTimeWindows.of(Time.second(5))).aggregate(...)
// 滑动事件时间窗口
stream.keyBy(...).window(SlidingEventTimeWindows.of(Time.second(10),Time.second(5))).aggregate(...)
// 事件时间会话窗口
stream.keyBy(...).window(EventTimeSessionWindows.withGap(Time.second(10))).aggregate(...)
计数窗口
// 滚动计数窗口
stream.keyBy(...).countWindow(10) // 当窗口元素达到10的时候,触发计算执行
// 滑动计数窗口
stream.keyBy(...).countWindow(10, 3) // 每个窗口统计10个数据,每隔3个数据就统计输出一次结果
全局窗口
stream.keyBy(...).window(GlobalWindows.create());
窗口函数
作用:定义窗口如何进行计算的操作
增量聚合函数
将数据收集出来,进行聚合。
- ReduceFunction
package ac.sict.reid.leo.Window;
import ac.sict.reid.leo.Computing.Aggregation.WaterSensorMapFunction;
import ac.sict.reid.leo.POJO.WaterSensor;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
public class ReduceFunction {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment environment = StreamExecutionEnvironment.
getExecutionEnvironment();
environment.setParallelism(1)