介绍

Fink的时间窗口(Window)可以分成两类:

1、CountWindow:按照指定的数据条数生成一个 Window,与时间无关。

2、TimeWindow:按照时间生成 Window。

TimeWindow,可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling

Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。

本文介绍会话窗口(Session Window),并通过例子说明如何使用这些窗口。

接下来文章介绍滚动窗口(TumblingWindow)、滑动窗口(Sliding Window)、CountWindow窗口,欢迎关注。

会话窗口使用例子

类似于web应用的session,也就是一段时间没有接收到新的数据就会生成新的窗口,由一系列事件组合一个指定时间长度的timeout间隙组成。

特点:时间无对齐。


Flink实战之会话窗口(Session Window)WindowsAPI使用示例_flink

Flink实战之会话窗口(Session Window)WindowsAPI使用示例_时间间隔_02

示例说明:

两次的时间间隔超过5秒的基础上再加延迟1秒后,没有新的活动事件这个窗口就会关闭,然后处理这个窗口区间内所产生的活动数据计算。

示例代码如下:


// 创建流处理的执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//声明使用eventTime
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
//2.使用StreamExecutionEnvironment创建DataStream
//Source(可以有多个Source)
//Socket 监听本地端口8888
// 接收一个socket文本流
DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);

// 输入的活动数据转换
DataStream<Tuple3<String, Long, Integer>> windowCount =
lines.map(new MapFunction<String, Tuple3<String, Long, Integer>>() {
@Override
public Tuple3<String, Long, Integer> map(String line) throws Exception {
String[] words = line.split(" ");
return new Tuple3<String, Long, Integer>(words[0], Long.valueOf(words[1]), 1);
}
});

// 描述 flink如何获取数据中的event时间戳进行判断
// 描述延迟的watermark1秒
DataStream<Tuple3<String, Long, Integer>> textWithEventTimeDStream =
windowCount.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Tuple3<String, Long, Integer>>
(Time.milliseconds(1000)) {
@Override
public long extractTimestamp(Tuple3<String, Long, Integer> stringLongIntegerTuple3) {
return stringLongIntegerTuple3.f1;
}
}).setParallelism(1);

// 按key分组,keyBy之后是分到各个分区再window去处理
KeyedStream<Tuple3<String, Long, Integer>, Tuple> textKeyStream = textWithEventTimeDStream.keyBy(0);
textKeyStream.print("textKey: ");

// 设置5秒的(会话窗口)活动时间间隔
SingleOutputStreamOperator<Tuple3<String, Long, Integer>> windowStream =
textKeyStream.window(EventTimeSessionWindows.withGap(Time.milliseconds(5000L))).sum(2);

//3.调用Sink (Sink必须调用)
windowStream.print("windows: ").setParallelism(1);
//启动(这个异常不建议try...catch... 捕获,因为它会抛给上层flink,flink根据异常来做相应的重启策略等处理)
env.execute("StreamWordCount");

Flink实战之会话窗口(Session Window)WindowsAPI使用示例_flink_03

在终端通过命令nc -lk 8888 输入一些数据


Sensor1 1000
Sensor1 7000
Sensor1 10000
Sensor1 15000
Sensor1 17000
Sensor1 24000

Flink实战之会话窗口(Session Window)WindowsAPI使用示例_数据_04

查看一下效果

输入第1个参数表示传感器id,空格后第2个参数表示时间,进行前一次输入与当前输入时间对比是否超过时间间隔。

第一个会话窗口 7000-1000=6秒 超过活动时间间隔5秒+延迟的watermark1秒,触发计算

第一个会话窗口 24000-17000=7秒 超过活动时间间隔5秒+延迟的watermark1秒,触发计算


Flink实战之会话窗口(Session Window)WindowsAPI使用示例_大数据_05

Flink实战之会话窗口(Session Window)WindowsAPI使用示例_大数据_06

如果觉得文章能帮到您,欢迎关注wx公众号:大数据技术天涯,共同进步!

持续分享java微服务技术,大数据、人工智能等科技类原创文章。

Flink实战之会话窗口(Session Window)WindowsAPI使用示例_时间间隔_07Flink实战之会话窗口(Session Window)WindowsAPI使用示例_数据_08