flink直接读取集合或文件中的数据时,实际处理的是有界流,类似批处理。
窗口类型:
时间窗口:滚动时间窗口、滑动时间窗口、会话窗口
计数窗口:滚动计数窗口、滑动计数窗口
watermark
watermark是插在数据流中的时间戳,与到达的数据的时间戳有关。表示watermark之前的数据都已成功到达。
比如:
计算每五分钟内的数据,watermark为1分钟,有两种计算watermark时间戳的方式:
1.周期性计算watermark,比如每200ms生成一次watermark,生成机制是到目前为止数据的最大的时间戳减1分钟。
2.间隔性计算watermark,每来一个数据筛选一次,生成一次watermark,生成机制是到目前为止筛选出来的数据的最大时间戳减1分钟。
window的触发机制:
按照自然时间将window划分,如果window大小是3s,则一分钟内会把window划分为如下形式(左闭右开):
[00:00:00,00:00:03)
[00:00:03,00:00:06)
[00:00:06,00:00:09)
[00:00:09,00:00:12)......12,15,18,21,24,27,30,33
window的起始和结束计算时间窗口本身与数据无关,由系统设定(计算方法:时间戳–(时间戳+步长)%窗口,比如一个数据的时间戳是199,窗口是15s,步长是5s,则计算出来起始时间是195。滚动窗口的计算窗口为[195,210),滑动窗口的计算窗口为[185,200),[190,205),[195,210)。)。
当watermark时间>=划分的window的结束时间时,触发计算。
处理正序数据:
比如3s的时间窗口,10s的watermark。
到来的数据与其watermark对应关系为:13s->3s,14s->4s,15s->5s,16s->6s,17s-7s,18s->8s,19s->9s,20s->10s,21s->11s,22s->12s,23s->13s,24s->14s,25s->15s,26s->16s。
在第25s的时候会触发计算。原因:25s的watermark为15s,说明15s之前的数据都到了,而[12,15)属于一个计算window窗口,到达了window计算触发条件,所以会触发计算。
例子如下:第一次触发计算时间窗口为[21,24),第二次为[24,27)。
eventtime:[1538359882000|2018-10-01 10:11:22.000],currentMaxTimestamp:[1538359882000|2018-10-01 10:11:22.000],watermark:[1538359872000|2018-10-01 10:11:12.000] eventtime:[1538359883000|2018-10-01 10:11:23.000],currentMaxTimestamp:[1538359883000|2018-10-01 10:11:23.000],watermark:[1538359873000|2018-10-01 10:11:13.000] eventtime:[1538359884000|2018-10-01 10:11:24.000],currentMaxTimestamp:[1538359884000|2018-10-01 10:11:24.000],watermark:[1538359874000|2018-10-01 10:11:14.000] eventtime:[1538359885000|2018-10-01 10:11:25.000],currentMaxTimestamp:[1538359885000|2018-10-01 10:11:25.000],watermark:[1538359875000|2018-10-01 10:11:15.000] eventtime:[1538359886000|2018-10-01 10:11:26.000],currentMaxTimestamp:[1538359886000|2018-10-01 10:11:26.000],watermark:[1538359876000|2018-10-01 10:11:16.000] eventtime:[1538359887000|2018-10-01 10:11:27.000],currentMaxTimestamp:[1538359887000|2018-10-01 10:11:27.000],watermark:[1538359877000|2018-10-01 10:11:17.000] eventtime:[1538359888000|2018-10-01 10:11:28.000],currentMaxTimestamp:[1538359888000|2018-10-01 10:11:28.000],watermark:[1538359878000|2018-10-01 10:11:18.000] eventtime:[1538359889000|2018-10-01 10:11:29.000],currentMaxTimestamp:[1538359889000|2018-10-01 10:11:29.000],watermark:[1538359879000|2018-10-01 10:11:19.000] eventtime:[1538359890000|2018-10-01 10:11:30.000],currentMaxTimestamp:[1538359890000|2018-10-01 10:11:30.000],watermark:[1538359880000|2018-10-01 10:11:20.000] eventtime:[1538359891000|2018-10-01 10:11:31.000],currentMaxTimestamp:[1538359891000|2018-10-01 10:11:31.000],watermark:[1538359881000|2018-10-01 10:11:21.000] eventtime:[1538359892000|2018-10-01 10:11:32.000],currentMaxTimestamp:[1538359892000|2018-10-01 10:11:32.000],watermark:[1538359882000|2018-10-01 10:11:22.000] eventtime:[1538359893000|2018-10-01 10:11:33.000],currentMaxTimestamp:[1538359893000|2018-10-01 10:11:33.000],watermark:[1538359883000|2018-10-01 10:11:23.000] eventtime:[1538359894000|2018-10-01 10:11:34.000],currentMaxTimestamp:[1538359894000|2018-10-01 10:11:34.000],watermark:[1538359884000|2018-10-01 10:11:24.000] 触发计算:2,2018-10-01 10:11:22.000,2018-10-01 10:11:23.000,2018-10-01 10:11:21.000,2018-10-01 10:11:24.000
【延时过大,24s以前的数据已计算,此条数据被丢弃】eventtime:[1538359882123|2018-10-01 10:11:22.123],currentMaxTimestamp:[1538359894123|2018-10-01 10:11:34.000],watermark:[1538359884123|2018-10-01 10:11:24.123] 【延时到达,被纳入窗口[24,27)】eventtime:[1538359885000|2018-10-01 10:11:25.000],currentMaxTimestamp:[1538359894123|2018-10-01 10:11:34.123],watermark:[1538359884123|2018-10-01 10:11:24.123] eventtime:[1538359895000|2018-10-01 10:11:35.000],currentMaxTimestamp:[1538359895000|2018-10-01 10:11:35.000],watermark:[1538359885000|2018-10-01 10:11:25.000] eventtime:[1538359896000|2018-10-01 10:11:36.000],currentMaxTimestamp:[1538359896000|2018-10-01 10:11:36.000],watermark:[1538359886000|2018-10-01 10:11:26.000] eventtime:[1538359897000|2018-10-01 10:11:37.000],currentMaxTimestamp:[1538359897000|2018-10-01 10:11:37.000],watermark:[1538359887000|2018-10-01 10:11:27.000] 触发计算:4,2018-10-01 10:11:24.000,2018-10-01 10:11:26.000,2018-10-01 10:11:24.000,2018-10-01 10:11:27.000
|
滑动窗口+watermark计算数据的时间窗口:
滑动窗口设为15s,滑动步长设为5s,水印为1s,来数据24s,25s,26s,在26s的时候触发计算。在26s的时候数据到来,表示25s之前的数据都已到达。每来5s的数据则滑动5s计算一次。
允许延时数据到达触发计算allowedLateness【实际行内大数据平台是没有这个选项的】。这个与watermark不同。这个是真的在等待数据到达。而watermark侧重于处理等待乱序到达的数据。