00:00
已经了解了窗口到底是什么东西,那对于这个窗口而言,它可以重叠吗?啊,之前我们看到的这种状态,看起来都是零到十秒,十到20秒,真的是就是完美的错开了,每一个数据都只放到一个窗口里边啊,那可以重叠吗?当然是可以的,如果说在前面这个框的形式的话,你要重叠,那可能就是中间有一部分是叠在一起的那个状态,如果是桶的话就更好理解了,如果是窗口重叠的话,那其实就代表一个数据要同时属于多个窗口嘛,那你直接复制一份给他发到这个窗口里边,保存起来不就完了吗?啊,所以这个其实是非常简单能够实现的。那接下来我们就来看一看窗口有些可以重叠,有些不能重叠,那这就涉及到窗口的分类了,我们看看窗口到底有哪些具体的类型呢?啊,之前我们接触过Spark里边的窗口啊,它是比较少的,我们根本就没有考虑还有什么窗口的类型,就是直接一种窗口创建用就行了嘛,Flink不一样,对于窗口的处理是flink的一大特色,所以它对于窗口的分类非常的灵活,首先我们可以按照驱动类型进行一个分类,什么叫做驱动类型呢?
01:10
就是说你的这个窗口判断它开始和结束,特别是这个结束啊,到底是按照什么来分的。比方说前面我们是零到十秒一个窗口,十到20秒一个窗口,我们先不看它具体这个窗口有多长,具体结束时间是多少,至少我们知道它是按照时间来结的,都是按照时间进展来划分的,这就是一种方式。那另外一种方式是什么呢?啊,另外一种方式就是可以按照数据的个数来驱动。那就是说我可以不按说现在的这段时间内有多少这些数据统计起来是一个什么结果,统计八点到九点的所有数据的和,我也可以统计什么呢?我可以统计过去100个数据的和,哎,或者说每100个数据我加一次和,这是不是也可以啊,这个数据的话,那就跟他的分散程度有关了,从时间跨度来讲啊,有可能这100个数据,呃,这个一秒钟就全来了,也有可能这100个数据花了一天才陆陆续续到齐,这都是有可能的。
02:13
那这个窗口长度按照时间来看的话,长度就不一样了,那如果说按照时间划分的这个时间窗口的话,里面的数据的数量当然就不一样了啊,所以这是不同的划分维度,按照驱动类型来划分的。那按照我们的习惯,之前看到的这些就全是时间窗口了啊,同样我们知道这个Spark里边的也就都是时间窗口了啊,这是一种划分方式啊,大家可以从这张图看的非常的明显,中间这个间隔就代表来的这个时间范围,所以这个时间范围如果等间距的话,这个就叫时间窗口,那下面这个呢,就是每三个数据和一个窗口,每三个数据和一个窗口,这就是一个。技术窗口啊,这就是基本的一个划分,如果要是用我们之前的这个发车来对比的话,时间窗口非常理解,就是定点发车,上多少人算多少人,到了点就发了啊,那技术窗口呢,那就是人满再发车,我这个车就是坐这么多人,不管什么时候到,我都是等到齐了才发。
03:17
这就是两种不同的窗口,然后更具体的划分,那就要看这个窗口到底长什么样,诶到底这个窗口的长度到底是固定还是不固定呢?哎,然后它的这个窗口之间到底有没有重合呢?这就涉及到了按照窗口分配数据的原则,还可以进行分类。哎,那这个分类我们看主体来讲,可以分成这样的四类。滚动窗口,滑动窗口,还有绘画窗口以及全局窗口,接下来我们分别就来说一下,第一种是滚动窗口,滚动窗口叫什么呢?啊,其实就是最简单的一种方式啊,对数据进行一个按照时间的,其实不一定是按照时间啊,这个滚动窗口跟我们前面划分的那两个维度没关系啊,这是另外一种维度,所以它就是对于数据进行一个均匀切片,你可以基于时间均匀切片,也可以基于数量均匀切片,你比方说像上面这个上面这个划分,这就叫做滚动窗口,它是均匀切片的嘛。
04:16
上面这个是相等的时间间隔,切一份切一份,下面这个呢,是相等的数量间隔,切一份切一份,这就都是滚动窗口。如果我们在这个图上画的话,这个就看的会非常的明显,当然了这种划分这就不是按照数量了,这个是按照应该这是按照time时间间隔啊。等时间间隔划分了一个窗口,滚动窗口的话,它定义这个窗口的时候,参数只有一个。要求是什么呢?就是定义这个窗口到底有多大。因为它是均匀切片嘛,所有数据均匀切片,所以它一定是一个接一个,一个接一个的出现的这样的窗口。所以数据只会被分配到唯一的窗口里面去,这就是之前我们看到的啊,它要么属于零到十秒窗口,要么属于十到20秒的窗口,要么属于啊下一个窗口,它肯定属于某一个窗口,而且只属于一个窗口。
05:14
所以它需要的参数只有一个,什么呢?就是当前的窗口大小,到底当前的这个窗口是十秒钟一个呢,还是一个小时一个呢?啊,还是一天一个呢?这都是不同的时间窗口,当然我们也可以定义不同大小的技术滚动窗口,那就是哎,你到底是一个长度为十的十个数一个窗口呢,还是100个数一个窗口呢?还是1万个数一个窗口呢?这都是滚动窗口的一个定义啊。滚动窗口其实应用非常的广泛,我们一般情况下用它可以对各个时间段做各种指标的这种聚合统计,比方说我们统计日活月活,呃,统计这个PVUV,往往都是一段时间,而且这个时间呢,都是标准的今天的,明天的,对吧,一天一天这样的,他们之间是没有重叠的,头帘尾,尾帘头,这个从形象上看的话,就好像是整体翻了一个跟头翻过来一样,一个窗口滚一下,滚动一下翻过来,滚动一下翻过来,所以这种窗口就叫做滚动窗口,在实际应用当中非常常见,可以说应该是我们在实际应用当中最为普遍的窗口类型,在所谓的这个商业应用BI分析指标里边,基本上都是这个滚动窗口啊。
06:29
然后接下来我们再来讲一下第二类窗口。滑动窗口,滑动窗口的这个英文叫sliding window,这个英文大家需要知道,为什么呢?因为后面代码里边就是根据这个英文来定义的啊,滚动窗口叫tumbling window,滑动窗口叫sliding window啊,那接下来我们看到滑动窗口和滚动窗口都是在动嘛,看起来都是定了一个窗口之后在动,所以它其实非常类似的,它的特点就是窗口长度都是固定的。
07:01
因为你想前面它既然是滚动窗口,那肯定窗口长度不变嘛,整个翻过去,整个翻过去,那现在滑动窗口呢,也是窗口不变,就好像是往前一步一步的滑一样,对吧?啊,往后一步一步的滑一样,哎,所以滑动窗口也是定义的非常的形象啊,你一看这个它长的这个样子,你就知道它是它是在往后滑,那么它的特点跟滚动窗口相比。它不是首尾相连的,而是什么呢?而是会中间错开或者是重叠一段区域,所以它的设置是有两个参数,一个是当前窗口本身的大小,另外一个就是滑动的距离,就是滑多久之后来开下一个窗口,然后滑多久之后开下一个窗口,所以大家看这样的话,统计的这个窗口之间就可以有重叠的数据了。哎,那比方说像当前的这个例子里边。我们可以看到WINDOW1和WINDOW2之间重叠了,WINDOW2和WINDOW3又重叠了,而且刚好我们看到WINDOW1和WINDOW3之间是没有重叠的,刚好头连尾,尾连头,所以当前的这个滑动不长和滑动,呃,这个窗口的大小什么关系呢?
08:15
刚好是一半1/2的关系,哎,所以的话,呃,WINDOW2就是刚好跟WINDOW1重叠一半,跟WINDOW3重叠一半,WINDOW3的话,诶刚好就划了两个一半,那不就全滑出去了吗?跟WINDOW1就没有重叠了。那提一个问题,当前的每一个数据应该同时属于几个窗口呢?现在应该不可能只属于一个窗口了吧,之前我们滚动窗口是只属于一个窗口啊,现在这里我们可以简单的举一个例子,可以很直观的看到,就比方说我们这里是一个小时一个窗口啊,那八点到九点。一个窗口。我就只写八到九了啊,九点到十点又一个窗口啊,前面这个是B的啊。
09:01
这是WINDOW1和WINDOW3,然后中间这个窗口呢,哎,那就应该是。八点半到九点半。这是WINDOW2。所以大家想到我随便来一个数据啊,比方说08:45。它应该属于几个窗口呢?哎,很显然它属于八点到九点的窗口,也属于八点半到九点半的窗口,但是不会属于九点到十点的窗口,那同样那08:15。是不是就只属于八点到九点这个窗口了呢?是不是就只属于一个窗口呢?那确实它不属于后边的WINDOW2和WINDOWS3,哎,但是既然是隔半个小时有一个窗口啊,这个难道只是往后面有吗?前面就不能有吗?当然前面也可以有啊,你既然有八点到九点的窗口,那前面是不是应该有一个?七点半到八点半的窗口啊。哎,所以08:15显然也属于。
10:04
七点半到八点半的窗口啊,所以在这个例子里边,当前的一个数据就应该同时属于两个窗口。比方说大家看一下中间这里的这个这个圆点同时属于WINDOW1和WINDOW2,后边的这个圆点同时属于WINDOW3和WINDOW4,但是一个数据就一定只属于两个窗口吗?不是的,它属于两个窗口是因为我们当前只能有两个窗口重叠,这个原因在于当前的滑动不长,是窗口长度的一半。那自然我们想到了,那假如我当前不是一半是2/3是WINDOW2,然后下一个是WINDOW3到再下一个正好跟第一个window啊,单维连头WINDOW4。上的一个数据同时属于几个窗口呢?哎,那肯定就是1/3 1/3嘛,它同时属于三个窗口对不对,它属于WINDOW1的后1/3,属于WINDOW2的中间1/3,属于WINDOW3的头1/3,哎,那所以当前我们的这个属于几个窗口,那你要看这个s slide就是当前滑动的这个步长啊,重叠的部分是2/3,那是不是滑动的步长就刚好是这里的这个1/3啊。
11:21
所以你就是要看滑动不长,到底是这个size整个长度的几分之一,那么是几分之一,那么当前一个数据就可以同时属于几个窗口啊,这就是我们得到的一个结论啊,那这里边在具体应用的时候有什么含义呢?那整体来讲也是我们可以统计一段时间内的数据。然后它有一个含义是。隔一段时间就另外开始统计一次。哎,这个有时候还是挺重要的啊,比方说我们可以怎么样,我开一个一个小时的窗口,统计一小时的活跃用户,然后可以怎么样呢,我五分钟就滑动一次,那这相当于什么呀。
12:03
那就是每隔五分钟我就要统计一下过去一小时之内的所有的活跃用户啊,所以窗口大小是代表了我收集数据的范围,收集数据的长度,而滑动不长代表的是。计算的频率就是多长时间统计一次,多长时间开一个窗口啊,那大家知道你既然窗口大小长度是固定的,那多长时间开一个,那不就是多长时间关一个吗?我们说关的时候就要计算嘛,就要输出嘛,哎,所以这就是计算频率。这是滑动窗口的这个概念啊,啊,这个也是比较有趣,聊到这里,大家其实就发现了,滑动窗口跟滚动窗口其实可以合二为一。滑动窗口的这个slide,之前这个看的好像都是比size小对吧,默认好像这个步子不能迈的太大,那如果说要是足够大,大到跟size一样会怎么样呢?滑动窗口,步子一划,整个窗口长度全划过去了,这不就是滚动窗口吗?不就是头帘尾尾连头吗?从这个角度上讲,可以认为滚动窗口就是一种特殊的滑动窗口,不是滑动不长等于窗口长度的滑动窗口。
13:17
这就是滚动窗口和滑动窗口,然后另外还有一种比较特殊的窗口,叫做绘画窗口啊,绘画窗口呢,就非常的就是有特点了啊,它叫session window,什么叫绘画?之前我们不是部署提交的时候有雅安session吗?不是有那个绘画模式吗?所谓的绘画其实就是我先建立一个绘画的连接,然后呢就基于这个连接开始传递数据啊,就像我们那个雅session,就是我先建立好这个连接,创建好这个集群,然后在这个集群里边就提交作业,这就像传递数据一样。啊,那我们可以跟生活实际联系起来,会话,就像我们打电话一样嘛,先接通,接通了之后,哎,他就一直保持通话中,我就可以继继续去说话了,哎,但是呢,你这个说话的过程当中,有可能一段时间这个大家好像找不到什么话题,就陷入了尴尬的沉默,陷入沉默之后啊,就会有有一个状况,你就会说,那是不是已经说完了呢?诶或者说那是不是信号不好,对已经听不到东西了呢?那干脆我就挂断吧。
14:17
啊,所以所谓的绘画窗口,它就是。设置一个会话超时时间,然后只要是这段时间我们还在通话,那么我们就继续保持着这个窗口就不能关这个连接继续保持着,一旦一段时间没有数据了,一段时间。不再说话了,那么我就认为好,这个会话可以关闭了,这个窗口可以关闭了,把之前的收集到的数据进行处理吧,所以会话窗口是这样的一个概念啊。从这个定义也可以看得出来啊,会话窗口是不是只能基于时间来定义啊,因为它必须要设置一个超时时间吧,你总不能说我设置一个超时的个数吧?啊,什么叫超时个数?好,好像没这回事儿是吧?啊,所以绘画窗口是只有时间上的,基于时间上的定义的,它最重要的参数就是这个绘画超时时间,所谓的这个时间间隔,这个GAP指定一个size,如果说两个数据之间间隔的这个时间超过了这个size的话。
15:16
那么我们就开启一个新的窗口,之前的一个窗口就可以关了,就可以统计了,那如果说要是两个数之间的间隔小于这个size的话,那当前这个数据就加入到当前开启的这个会话窗口里面去。窗口就还不关啊,这就是这样的一个东西啊。具体实现的话,我们可以就是把这个设置成一个静态的大小,就直接给定这个到底间隔是多大,我就超时关闭也可以呢,自定义一个提取器,动态提取,就是说这个提取器就是说我根据当前数据的特点来配当前这个GAP到底取多大啊,这个就是在有一些特定的场景下还是有用的。所以突发窗口跟之前的两种窗口都不一样,首先是它不可能有技术窗口,其次即使都基于时间,它也不一样,它的窗口长度是完全不确定的,而且呢,呃,窗口这个中间是有有空隙的,空隙之间是完全没有数据来的,它的起始和结束时间也完全不确定,一切都不确定,确定的只有一个超时的时间。
16:19
大家要注意啊,超时的时间是一个限定的参数,并不是这里的固定的间隔啊,就是我只能保证这里的这个间隔是超过了我限定的那个大小的,并不能确定说一定是那个大小啊,这是这个特点啊,这里还要多说一句,关于这个绘画窗口啊,在乱序数据的时候还有点麻烦。因为它是时间窗口嘛,设置的是这个超时时间,那这里有一个问题,就是说,假如说你的这个窗口超时时间设的比较小,我乱序程度又比较大啊,那假如说我认为超过两秒钟没来数据,我就要关了。前面我的这个数据,比方说三秒的四秒的五秒的不停的来对吧,然后后面就来了一个八秒的数据。
17:07
那这个时候我可能就觉得好,这已经超过两秒间隔了,前面这个窗口关闭了,后面这个八应该就是新的窗口了,但是我有可能有乱序数据来呀。后面又来了一个六,又怎么办呢?哎,那他就会发现六其实应该属于前面这个窗口对吧,跟他还连在一起的,哎,那所以在这种情况下,我之前这个窗口还应该等着啊,这个也还好,那大家说我这不是还有那个延迟触发机制嘛,我用那个watermark来判断不就完了吗?那大家自然就想到了,我延迟两秒钟,等到延迟的那两秒钟超过它的那个时间间隔两秒到了七秒以上,我再到这个点,对吧,比方说来了久了。来了久了,这个时候我再关,哎,那那这样行不行呢。这样也不行。为什么呢?假如来了九之后再来了七,现在这是什么场景?现在变成了3456789,是不是数据都有啊?
18:00
按照我们的定义,是不是所有的这些数据应该都属于一个会话窗口?所以会画窗口很麻烦啊,就是它涉及到乱序的时候,有可能还会涉及到窗口要去做合并,要去墨,所以对于这个窗口算子而言,它的那个源码里边是单独有一块逻辑,就是单独要处理窗口合并的这种状态的,这个主要就是针对绘画窗口这种场景而言的。另外还有一个比较特殊的窗口叫全局窗口啊,这个就更加的奇葩一点,这个窗口就是全局有效,啥意思呢?呃,就是所有的数据都分配到同一个窗口里边啊,这个大家要注意是相同K的所有窗口啊,啊,前面我们没给大家解释这个跟K的关系,因为这里大家看到这个user不一样吧,USER123,那自然会想到按照user我们进行的KBY,这个时候开窗的话,那应该是所有的user的数据都在同一个窗口内吗?显然不是的,我们之前都是想的分组聚合嘛,那既然是按照user已经分了组,我们自然是想USER1统计自己的数据,USER2统计自己的,呃,分别统计,所以这里只是一个示意图,表示这个时间范围是这样的,不同的user呢,他们的这个窗口时间都是对齐的,都是同样的时间结,但是其实结的。
19:21
它们是不同的计算结果,也就是说这里面如果要统计的话啊,窗口一结束的时候统计算什么呢。USER1这四个数据,哎,在这个时间点上的这个就不算了,对吧,这个时间点上的是属于下一个窗口了啊,那所以USER1这四个数据算一个结果,USER2这四个数据算一个结果,USER3这四个数据算一个结果。它是针对每个K分别去算的。所以接下来OPPO window大家也就知道了啊,这个所谓的全局有效是什么呢?也是。一个K里边的所有数据做划分,都在同一个窗口里面。那既然这么划分的话,全部都在一个窗口里边,那这个窗口大家看就没有结束时间了,对吧,那你到底什么时候触发计算呢?啊,所以它默认不会触发计算,这样你不触发计算这个窗口没有意义了,所以如果想要用它用这个全局窗口的话,那就要自定义一个触发器,一个trigger。
20:20
这也是这个窗口里边的一个特色啊,后面我们讲可选API的时候会讲到这个trigger,它是可以定义也可以不定义的,就是你如果用到了全局窗口的话,那就必须得去自己单独去定义一个这。一般很少用啊,那为什么还要提一句全局窗口呢?因为。Link内部给我们实现的技术窗口count window底层就是全局窗口啊,所以他们是有关联的啊。这就是关于这个窗口的一个分类。
我来说两句