00:00
那接下来我们在最后给大家总结一下flink的主要特点,首先呃,我们发现这个flink其实啊,要跟传统的数据处理架构做对比的话,它可以认为是跟哪一类更相似呢?诶,它其实跟我们一开始这个事事物处理啊,事件驱动的这种方式啊更加的相似,大家看到它的这个处理过程是什么呢?我们传统的那种方式不是跟那个关系数据库去做交互吗?对吧?用户那边呃,有数据啊,有事件来了,然后这里边我有一个后台处理流程,然后去读取或者去写入这个关系数据库,最终得到一个结果返回给用户那边触发一个操作,这是传统的这个关系型事故处理的啊呃,这种方式,那现在flink他做这个事件驱动又是什么样的呢?整个架构非常的类似,同样还是用户那边有数据对吧?呃,当然这里边可能一般就不是直接发那个数据请求了,而是啊,就是我们这边是一些事件的日志先收集起来,在前边把它读取进来,读到flink内部来之后呢,我现在不去查关系数据库了,因为查数据库连表查询这个就慢了,那我现在直接就是。
01:19
本地状态对吧,直接就存在本地状态里面,然后这个本地状态呢,因为要去保证这个容错,还可以去把它做一个定期的存盘,放在远程的19块存储空间里边。那通过这个本地状状态和当前我读入数据的一个结合,一个计算,最终是不是就可以得到一个结果啊,得到的结果哎,那就直接输出到我对应的这个输出的事件日志里面去,或者触发一个操作,大家看整个流程是不是跟这边非常像。啊,这就是事件触发的机制,所以大家后后面就会发现啊,你如果想要去处理流式数据,或者说想要去做这个数据流的计算,那最基本的一个。
02:06
架构的一个设计就必须要是不是事件出发呀,因为我当前数据流嘛,整个这个数据这个像水流一样的源源不断的来,那我是不是就不能指定这个程序什么时候开始,什么时候结束,我就必须是相当于启动一个任务之后就等在那里,然后来一个数据就触发一计算,来一个数据出发一次计算啊。必须是这样对吧,哎,所以它是一个事件驱动的过程。然后后边我们看啊,接下来这个特点,这就上升到了一个世界观的高度啊,我们当前这个是一个基于流的世界观,在flink的世界观里边,一切都是流,哎,那什么叫一切都是流呢?就是假如说我现在要处理这个离线数据。假如说我现在这个数据就是离线的一批数据来了,那我怎么处理呢?弗林也可以处理它,把它看成什么呢?
03:01
哎,它就把它看成一个所谓的有界的流来做一个处理就可以了,那实时的数据不停连续不停不停的数据来,它就是一个无界的流,对吧?啊,连续不断没有截止,大家看从这个图上看的很明显啊,那我这里边的数据一条一条就是不停的来,不停的来,对吧?啊,那正常情况下他应该是有头没尾,永远没有没无休无止,那所以这就是一个所谓的无界流。那对于离线数据,或者说我要截取一部分数据去做计算的时候,那怎么办呢?诶大家想,那那是不是就是你到这个位置的时候,我直接把它截出来就完事了,对吧?啊到这儿就直接做计算,而不是说来一个呃,处理一个啊我是在这中间我可以一直等着,等到这一段数据都到齐了之后,我直接做一个计算,这就是一个所谓的有界流的概念,所以现在我们是不是就解答了最初官网上看到的那一句话,我们做的是什么呢?啊,针对这个无界或者有界数据流做有状态的计算啊,那什么叫有界无界,什么叫有状态,现在大家都搞明白了对吧?好,那最后还有一个特点就是呃,这个flink它拥有非常容易使用的分层API,有不同层级的API,这就给大家提供了更多的可能性啊,就是我可以调用非常底层的API,也可以调用高层级的API。
04:30
哎,从上到下大家看,分成了这样的三层。最上层是。Flink CQ和table API,这是最高级的一层API啊,就是使用起来的话,它其实就是非常的简单,里边的这个方法也非常的容易理解啊,大家直观看的话,这就是都是表,对不对,把里边的数据就当成表来做操作,而且就是甚至可以直接去写CQ。你直接直接写一条CQ,就像大家最熟悉的这种方式啊,写一条CQ,一个字符串啊,CQ写完了之后一执行就完事了,就把我们当前这个任务就就搞定了啊,所以在实际应用的时候,一些简单的需求,用这种方式是最容易实现的,那中间这一层呢,这是flink可以说是他提供的API里面的一个核心层级,它提供的这一层API叫data stream API啊,当然这里面大家要注意一下,就是这一层级的API,它是数据流API对吧?啊,那主要就是用它来做这个。
05:31
就是无界流,我们做这个实时计算的时候,主要用的是这个data data stream API,那如果要做这个离线计算,处理这个有界的数据呢,它有另外一套叫做data set API啊,所以flink其实本身它是一个可以认为是一个批流统一的这样的一个框架啊,它可以做离线,也可以做实时。啊,那它的这个API略有不同,离线的那个叫data set,我们这个实时的这一部分叫data stream啊,所以我们一般用它做实时嘛,所以stream API也是用的最多的,那么这一层级的API呢,诶,大家就会看到它这里边能够拿到的这个信息就会多一些,而且我们这里边可以直接获取到当前数据流里边每一条数据的各种信息,另外还可以啊,就开窗口,做窗口相关的一些操作,做一些精细控制,在这个层级都是可以做的。
06:28
啊,因为你在上层的话,就相当于都是表嘛,直接写CQ对吧?啊就控制可能没有那么精细,在这一层级可以做的事情就更多。那当然还有最底层啊,最底层的这个API叫做process function API,他能做的事情就更多了,大家看这里边他能拿到是什么呢?首先能拿到当前的每一个事件啊,具体的数据肯定能拿到,另外呢,还能拿到状态,我们不是说可以做那个有状态的计算吗?你可以自己去定义各种各样的状态啊,另外还可以拿到时间,甚至我们后面讲到呃,会告诉大家,就是这里边你还可以去定义一些自定义的定时事件,什么叫定时事件呢?就是相当于我设一个闹钟,我可以让就是当前我要做的这个操作啊,这段代码逻辑不是现在马上执行,过一段时间之后到几点的时候再去执行,它都允许我们做这些操作啊,所以这个process方式可以说是非常强大,也是非常灵活的,使用起来的话,可以说是所有的需求理论上啊,都可以用这个最底层的process function结合这个PI。
07:38
实现啊,当然了,就是它可能使用起来这个代码的逻辑啊,这个难度也会更大,对吧?所以我们可以总结起来就是越往底层就会越具体,实现起来越灵活,表达能力越丰富,但是呢,用起来可能就稍微会麻烦一点,而越往上层呢,就会越抽象,用起来就越简单越方便啊这是这个不同层级分层API的一个特点,然后最后我们再总结一下flink其他特点啊啊,这就是把我们前面讲到的那些优势全要列举列举一遍了啊,首先在flink里边它是支持不同的时间语义的,大家看这里边它支持事件时间和处理时间不同的时间语义啊,那至于这个到底是什么,我们后面讲到再说啊啊另外它还支持精确一次的状态一致性,保证所谓的状态一致性,大家可以理解成就是我们前面说的啊,就是结果正确对吧?啊,就是出现故障之后也要保证它的这个。
08:38
呃,就是最后恢复之后的那个结果是正确的啊,所以这就是所谓的状态一致性的概念,另外就是低延迟高吞吐,他在理论上啊,可以实现毫秒级的延迟,而且每秒处理百万数百万个事件,这是flink的这个并发能力啊,和这个延迟的这个能力,另外它还可以和众多的常用存储系统做方便的连接,它可以实现高可用动态扩展,真正实现七乘24小时全天候运行啊,这就是flink的所有的特点。
我来说两句