00:00
到目前为止呢,我们已经学完了flink的所有内容,在这个漫长的学习过程当中,我们其实会发现啊,Link里边的知识点真的是非常非常的多,而且也很有难度,所以最后呢,我们再来做一个总结回顾,把之前所有学过的内容再梳理一遍。哎,那一开始首先呢,我们其实是做了一个flink的简单介绍,哎,我们先了解了一下flink到底是用来干什么的,它的缘起设计理念到底是什么样的,那学完了之后回头看的话,我们其实已经很明确的知道,Flink就是一个有状态的流式处理引擎,它用在大数据的实时流分析当中,当然了,现在的弗link呢,已经是一个流批一体的大数据处理框架了,哎,那但是它的本质,它的底层架构还是基于流处理的,所以它的最主要的特点呢,就是快,就是低延迟。但是我们又说它在保证快的同时,还保证了高吞吐,还保证了处理结果的正确性,它是怎么做到呢?诶,我们知道传统数据处理里边,如果想同时做到结果的正确性和实时性的话,诶,那我们得用拉姆达架构,也就是同时使用一个批处理器和流处理器两套架构来保证这一点。
01:16
而现在弗link呢,一套架构就实现了我们所有的功能,诶,所以我们说弗link特别强大,后边我们学完了之后其实也就发现了啊,在我们讲到时间属性的时候,这里边非常重要的一个概念就是水位线的引入,怎么样能保证结果的正确性呢?关键就在于能够正确的处理迟到数据,能够处理乱序数据,这里的水位线我们可以通过设置一个延迟时间,多等一会儿,这样的话就可以正确处理乱序数据了啊,当然了,我们说对于弗link而言,它处理迟到数据的方式呢,不仅仅只有水位线的延迟一种方式,因为我们知道水位线延迟相当于是直接把这个时间调慢,它是全局有效的,这个代价比较大,哎,那所以一般呢,我们是给水位线一个比较小的延迟时间,那如果说后边我们经过这个时间操作之后,发现又有迟到的数据,又出现乱序,那水位线搞不定那些数据要丢了。
02:16
怎么办呢?哎,如果是窗口处理的话,我们还有第二处保证窗口可以设置一个loud lateness时间多等一会儿,在这个时间段内呢,还可以收集迟到的数据,在之前窗口聚合结果基础上继续进行叠加,那最后还有一个兜底的方法,我们说那就是最终的输出到测出出流啊,其实这个方法呢,在我们最后讲到的cep里边也有体现,我们可以把最后water mark延迟没有等到的那些迟到数据都塞到特殊出流里边进行一个额外的处理。所以我们说flink使用一套系统就实现了拉姆达架构里边两套系统的功能。整体来看的话啊,我们这里处理的核心其实还是实时性和我们结果正确性的一个平衡啊,这就是关于这个link核心特性的一个解释,我们学完了之后就知道到底是怎么回事。
03:13
然后接下来呢,Link还有一个非常重要的特性,就是我们所谓的分层API,其实关于这里的分层API我们就会发现啊,中间层data three没PI,这就是我们整个学习link过程当中的最重要的一个环节。那后边我们讲到第五章内容,Data没PI本身就是针对这个核心层API的主要讲解,当然了,这里都是一些基础的应用,最简单的应用啊,我们分成了三步,那就是首先是一个S,然后是转换算子transformation,最后是输出算子think。那除了这些之外呢,弗link还提供了很多更加高级的转换处理操作,诶那其实后边的内容我们都可以认为是dataam API这个核心层里面的一部分啊,比如说后面我们讲到第六章里面的窗口,那窗口API我们单独把它叫做window API,那本身呢,它也是基于一个data stream,首先我们做KY啊,KY之后呢,基于k stream调一个window方法,诶,那指定一个窗口分配器,得到一个window stream,然后再定义一个窗口函数,最终再回到data stream,所以我们看同样它也是核心层API基于data stream做的转换啊,所以窗口操作是一种比较高级的data stream API。
04:29
除了窗口之外呢,哎,那另外我们还可以做一些比如说多流转换的操作,本质上来讲这其实也是API,只不过我们可能涉及到了两条或者两条以上的流,那最经典的方式当然就是两条流直接connect了,我们也知道啊,Connect底层的话可以获取到非常多的信息。那另外呢,还可以方便的进行基于时间的合流,这就是我们所说的双流draw啊,我们可以做window draw窗口连接,也可以做间隔连接internal draw,另外还可以做窗口同组连接window Co group,这就是我们所说的data threepi所介绍的所有内容。
05:09
那当然了,前面第七章我们还介绍了一个更加底层的API的用法,那就是处理函数process方式,它的最大的特点其实就能获取到一般我们在data stream API里边拿不到的那些东西,哎,那本质上来讲,在最底层呢,我们直接可以获取到当前的状态,我们可以进行有状态的流处理,另外呢,在处理函数process方式里边还可以去获取到当前的时间信息,另外还可以注册定时器,指定我们过一段时间之后在某个时间点去触发一些操作,所以说process function啊,它是一个大招,平常能够遇到的所有需求,几乎都可以使用处理函数去进行一个实现啊。那另外处理函数还有一个功能,就是我们说的啊,它可以做这个测殊处理啊,那有了这个功能之后,就可以非常简单的实现所谓的分流操作了。
06:01
诶,那这样的话就把我们前面介绍的所有内容都串在一起了,另外还需要强调的一点,就是所谓的有状态的流处理计算呢,并不一定非得在处理函数process function里边去定义我们的状态啊,因为我们说process function之所以能够定义状态,主要是因为哎,它继承自负函数类,它是一个rich方式,而在负函数类里边呢,直接可以获取到当前的运行式上下文,所以本质上来讲是在负函数类里边获取到了运行上下文,就可以去进行有状态的处理了。诶所以第九章我们介绍的状态编程,这个就不局限在process方式里边,针对flink里边的每一个算子,我们说它其实都有对应的rich版本,如果我们实现了reach方式的话,那其实就可以在里边自定义状态,然后进行各种各样复杂的处理了。那关于这个状态呢,我们又进行了划分啊,最常见的其实是k set,它是按键分区的状态,注意这种状态其实是使用最频繁,而且我们说啊,只有按键分区之后,如果使用K的process方式的话,才能定义定时器,诶,所以基本上我们实际编程的时候啊,都要对当前的数据流进行一个KBY按键分居操作啊,这基本上就是一个标配了啊。然后另外呢,我们还介绍了算子状态,算子状态主要特点就是诶,那就跟K无关,同一个分区里边的所有数据都能够访问到相同的状态实例啊,那这个就相对来讲会简单一点啊。然后另外还有一个广播状态,这个更特殊一点,我们说它一般呢,就是一些动态的配置项可以放到一个广播流里边,然后呢,两条流在做一个connect,接下来就可以使用广播状态去控制我们的一些行为了。
07:49
那最后在第十章的时候,我们还介绍了flink里边的容错机制,那核心就是一致性检查点checkpoint。啊,那除了底层的这些API之外,另外呢,我们还介绍了flink的上层API,那就是table API和CQ,这部分内容比较多,但是事实上呢,最核心的地方就是我们理解在流处理当中,表到底是怎么做计算,我们搞清楚了动态表和持续查询,知道了最终得到的结果是一个更新查询的结果,还是紧追加查询,哎,那其实所有的问题就都迎刃而解了。其他的API调用呢,那其实就是对应我们之前data three API在CQ里面的一个表达而已。
08:34
那最后我们还介绍了flink cp,这主要是处理复杂事件的一个flink库,哎,那同样CP也应该是更加高层级应用层级的API,而整体来看的话,CP其实是跟CQ在一个层级,有了这些所有的知识之后,接下来我们在工作当中到底应该怎么去用这个link相关的API呢?诶,那就是我们说的啊,如果我们对CQ比较熟悉的话,那肯定就是来了一个简单的需求,能用CQ就用CQ了,因为CQ里边给我们提供了很多很多系统函数,哎,所以像我们之前说的啊,你如果做一个。
09:11
平均值的计算,哎,那我们根本没有必要在data STEM里边自定义对应的那些聚合操作,你直接调用avg不就完了吗?诶,包括我们之前说要计算UV的时候,你直接用一个distinct不就完了吗?哎,那所以直接使用CQ其实是最简单的方式,那当然了,如果说有一些需求比较复杂,CQ没有办法直接搞定啊,或者说我们对CQ不太熟悉,诶,那平常一般也就是直接使用datapi。核心层的做一个流处理计算就可以了,那如果说data stream API搞不定的话,那怎么办呢?诶,那我们就使用瑞function去做状态编程,或者是使用最底层的process function做各种各样的处理转换,还可以定义定时器,那基本上就可以把所有的需求全都搞定。这就是关于我们link学习的所有内容。
10:02
在这里也感谢大家的坚持观看,那我们这门课程的内容就全部结束了。
我来说两句