大数据flik的作用(大数据flik实时计算方案)
导语:大数据_Flink_Java版_数据处理_Watermark_特点和行为
然后我们再来看这个waterMark,他怎么能保证数据,不乱序呢?
可以看到,这里我们就要知道waterMark是什么了?
可以看到waterMark是一条特殊的数据记录.实际上他就是个时间记录.
可以看到,上面方框是数据,下面的三角是数据携带的时间戳,然后2,是插入的waterMark.
这个插入的waterMark必须是单调递增的,因为waterMark是时间的数据,时间永远向前.
waterMark还要和时间戳一块用,因为,要保证,数据的顺序,那么waterMark一定要和实际的数据
的时间戳要关联起来,要按照实际数据的时间戳来设计waterMark对吧.
我们去看一下flink的java api中就有一个类,叫做Watermark对吧.
可以看到他就是一个类,继承了StreamElement说明他就是一个数据对吧,可以看到他里面
有个timestamp的字段,说明他就是一个时间数据.
这里看到5这个waterMark,那么就认为是,5之前的数据都到齐了,那么就应该关闭5秒的这个窗口,然后如果后面的数据,该来的还没有来的话,那么只能就丢数据了.
可以看到如果,我们想让1,4,5,2,3都包含到窗口,5秒的窗口中去,那么我们的waterMark设置,延迟多少呢?比如这里我们先设置延迟2秒,那么,到1这个数据的时候,1-2 = -1 就是-1,然后
4-2 就是2,然后5-2 = 3,那么到3这个waterMark的时候,就认为3这个waterMark之前的数据
就都到了.
那么如果这里我开的窗口是3秒钟的话,那么到这里waterMark是3这里,窗口就关闭了,后面的2,就丢了对吧,这里就是我们开了3秒的窗口,应该包含数据,1,2,但是现在如果我们设置waterMark是2,那么
就会导致丢数据对吧.
那么如果我们设置3秒的,waterMark的延迟时间呢?
可以看到1,4之间应该写-2 对吧,1-3 = -2,然后,4和5之间可以看到4-3 =1,写1,然后
后面5-3,写2,然后2这里,减不开,减不开说明是什么?之前的数据对吧,这个时候,waterMark,应该还是2,表示这个数据应该留下,然后再下一个,3,也是-3 = 0,这里应该也写2对吧,减不开,减了以后是0了,
然后再看6这里,6-3 =3 ,这里写3,然后再看7后面这里,7-3 =4 这里写4就可以了,然后再看,后面如果又来了一个5呢?这个时候,因为前面waterMark已经是4了对吧,前面我们也说了waterMark是单调递增的,因为他是时间,所以这里,5-3=2 ,而现在我们的waterMark是4,所以,后来又来的5这里,依然
waterMark要放置4对吧,然后再看后面来了一个8,那么这个时候,8-3 =5 所以,这里waterMark是5了,这个时候,5之前的数据表示都已经接收完毕了.
所以接下来0到5秒的窗口就已经关了.
这里我们一般设置延迟的时间是多少呢?
注意这里我们一般设置,延迟的时间的尺度最大的对吧,比如这里5-2 =3秒,5-3 =2秒,这里
我们要选择迟到幅度最大的,作为waterMark的,延迟时间设置,比如上面,我们就设置了,
5-2 =3秒,作为waterMark的延迟时间对吧.
这部分不是太好理解,为了理解的更深刻这里再做说明,,可以看到上面,我们说,我们设置waterMark延迟多少,一般看乱序程度,也就是说,比如这里,5-2=3 5-3 =2 这里,乱序最大的是3对吧,所以这里我们就设置3是waterMark的延迟时间,那么,如果这个窗口我们设置的是5秒的话,那么.
可以看到数据来了1,放到[0,5) 这个桶里,我们知道现在我们有一个窗口,然后我们这个是滚动时间窗口是,这是一个窗口但是我们可以有多个桶,[5,10) 这里可以是一个桶,那么1来了放[0,5)桶里,然后
4来了放[0,5)桶里,然后5来了这时候就放[5,10)桶里,然后2来了再放[0,5)桶里,然后3来了再放[0,5)桶里,然后6来了再放[5,10)桶里,7来了再放[5,10)桶里,然后5来了再放[5,10)桶里,然后8来了再放
[5,10)桶里,然后再看8后面的waterMark这个时候就是5了,这个时候,就可以关闭,这个窗口,要注意,5秒的窗口是,以waterMark为基准计算的,这个时候桶[0,5) 就输出结果,然后如果这个时候,5这个waterMark后面又来了一个4,那么这个只能丢了对吧.
但是我们说flink有3种方式,保证数据不丢失,不乱序,这个时候你可以设置一个,延迟时间,给这个滚动时间窗口,那么这个时候,waterMark到5 以后会先输出一个结果,然后比如这里延迟了1分钟,那么
等,waterMark是60 + 5 前面窗扣是5秒对吧,是65的时候,那么,waterMark5到65这个期间的数据是来一个,只要是[0,5)这个桶里的数据,就会更新一下结果对吧,一步步接近真实值.
然后你也可以设置比如一个侧输出流对吧,把没跟上这个5秒这个窗口的,数据放到侧输出流中去,然后下一波数据来的时候,再获取侧输出流一块处理.
然后还可以怎么样?可以看到,要想获取后面新来的4这数据,可以这里我们调整一下,乱序程度这里,我们设置成4,我们之前说5-2=3 5-3=2,因为我们看的时间尺度短,如果看的长,可以看到后面还有个8-4 =4对吧,所以这里我们可以设置为4,这样就可以把后面来的那个4,数据包含进来了.
可以看到上面,如果窗口是5秒,然后我们想只用waterMark处理,获取到左面的那个4数据,可以把waterMark设置为4对吧.
如果用其他兜底的方法,可以和时间窗口结合起来,比如设置窗口延迟时间,利用侧输出流等.
本文内容由小信整理编辑!