详见:https://blog.csdn.net/lmalds/article/details/52704170
补充说明:
1、例子的并发度是1,如果是多并发时,情况是不一样的。
env.setParallelism(1);
2、对于多并发情况,各个进程之间的水位线是独立的,也就是每个进程之间有各自的水位线。但是当某个进程触发了自己的窗口,也会触发其他进程相同的窗口,保证了水位线窗口中数据的一致性。
env.setParallelism(n);
3、由于窗口触发有2个条件:(1)水位线到达下一个窗口。(2)触发的窗口中有数据。因为多并发的时候,各个进程之间的水位线是独立的,所以有可能进程 A 某个窗口的数据,需要由进程 B 来触发。
4、如果在设置 watermark 后有多个窗口操作,则窗口之间是共用一个 watermark 的。
// 数据解析过滤
DataStream<OnlineMinuteData> dataStream = transaction.map(s -> OnlineMinuteData.buildOnlineMinuteDataInfo(s))
.uid("source-map")
.filter(s -> s != null)
.uid("source-filter")
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<OnlineMinuteData>(org.apache.flink.streaming.api.windowing.time.Time.seconds(30)) {
@Override
public long extractTimestamp(OnlineMinuteData element) {
return element.getCountTime();
}
})
.uid("source-water-mark");
DataStream hourLogicalVersionStream = dataStream
.filter(s -> s.getSourceType() == ServerTableEnum.LOGICAL_SERVER.getServerTableType() && s.getVwType().equals(Constant.ONLINE_DATA_TYPE_VERSION))
.keyBy("vwType","vwId", "areaId", "serverId")
.timeWindow(org.apache.flink.streaming.api.windowing.time.Time.hours(1))
.apply(new LogicalAggWindowResultFunction())
.uid("hour-logical-version-window");
DataStream dayLogicalVersionStream = dataStream
.filter(s -> s.getSourceType() == ServerTableEnum.LOGICAL_SERVER.getServerTableType() && s.getVwType().equals(Constant.ONLINE_DATA_TYPE_VERSION))
.keyBy("vwType","vwId", "areaId", "serverId")
.timeWindow(org.apache.flink.streaming.api.windowing.time.Time.days(1))
.apply(new LogicalAggWindowResultFunction())
.uid("day-logical-version-window");