00:00
讲flink当中也是非常重要的,另外一部分内容就是所谓的状态管理啊,那状态管理这一部分呢,主要给大家讲一讲,就是一直在讲状态,什么是flink里边的状态,先给出一个概念,然后呢,对于flink里边的状态主要是分成两大类,一类叫做operator state,我们翻译成算子状态,另外一类呢,叫做k state啊,我们叫做监控状态,或者叫分组状态,这个都是可以的,那呃,在实际使用的过程当中,一般情况啊,我们编程做这个状态编程的时候,使用这个监控状态k state比较多啊,那往往我们就是以这个啊去去做这个状态管理状态编程的,所以说我们的重点是讲这个,那最后还有一部分是讲这个状态后端啊,就是大家看看这个所谓的状态后端的配置是什么,那最后当然了还有一部分,呃,就是从状态这一块又会延伸出来一个内容,就是说做状态编程,那有了状态。
01:00
后端之后呢,它还可以去做状态的保存啊,那这个保存其实是涉及到了flink里边的容错机制,那就涉及到了checkpoint,那这一块内容我们放到后面再讲啊,但是大家会想到它跟状态都是密切联系,息息相关的,所以接下来其实是一整块内容,那首先我们还是先来说一说弗link当中的状态到底是什么啊,那前面我们一直就是说第一节课大家就提到了啊flink对对自己的定位是什么呢?它是一个呃,分布式的这个框架和大数据处理引擎,而且它做的计算是什么呢?是有界和无界的数,有有状态的数据流,对吧?啊,对于这个数据流做有状态的计算,哎,那这里边大家就会想到这个状态,我们其实在做操作的过程当中,好像也未必随时都有,对不对啊,所以对于这个flink而言,它其实里边的计算啊,啊,我们知道它是。
02:00
分开的每一步计算都是一个任务,对吧?啊,都是这个data flow数据流里边的一个任务,然后我们这个任务呢,它其实是可以有状态也可以没有状态的,那你像我们之前讲的没有状态的话,你像我们直接做一个map,直接做一个filter,哎,大家想想我们在做这个操作的过程当中,你是不是就只是依据当前输入的数据是什么,然后按照一个规则做一个转换输出就完事了啊所以在这种场景下,其实呢,呃,就是我们讲的这个简单的聚合,呃,简单的转换算子啊,其实这里边就只是一个输入和输出而已,所以这里边其实并没有涉及到状态。只跟当前这条数据有关,对吧?啊,我不需要其他额外的数据了,但是有一些呢,就没那么简单,比方说我们讲到的reduce,对吧,讲到的这个聚合操作,比方说我们讲到的这个窗口计算啊,那你说你要窗口最后输出一个结果的时候,你能是一条数据来了之后直接就输出一条结果吗?当然不能,对吧?啊,你做这个K之后,Reduce或者说做sum,做这个count的,做这个呃,最大最小值计算的时候,你是只根据当前的这个数据就能输出一个最大最小值吗?当然不能,还必须知道什么呢?还必须知道之前我们所有数据统计出来的一个最大最小值,那这个数据其实对于我们而言,就是为了得到当前最新输入的输出的时候,哎,我们就是除了当前的输入数据之外,我还得依赖另外的一个数据,那这个数据就叫做当前任务的。
03:43
状态对吧?啊,那就是我们所说的这个,如果说呃,就是对于这个flink里边来讲啊,我们说它是做这个有状态的流式计算,那有些任务比较简单,其实也可以是无状态的,而对于我们一般情况下用到的这种聚合计算,或者说窗口计算,或者说其他一些比较复杂的计算,我们自己又定义了一些额外需要处理的这个呃数据,对吧?这些数据就都叫做状态,那整体来讲的话,状态到底是什么呢?大家可以简单认为它就是一个本地变量啊,因为我们说这个task啊,在执行的时候,它不就是在lo上执行的一个线程吗?啊,对吧,那它在执行的过程当中,我们用到的所有数据是不是就应该保存在当前线程所独享的那一段内存里边去啊,那所以这个状态其实就是它已经持有的一个变量而已,可以被当前任务的任意业务逻辑来访问。
04:43
啊,那弗link在这个状,在这个整个运行的过程当中,会帮我们做这个状态管理啊,因为大家想到有同学可能想,如果是本一个本地变量的话,那干嘛还非得叫这个状态呢,我自己定义一个变量不就完了吗?你就像我们在代码里边,你随便这个挖一个对吧,要想还想改变这个值的话,你你做做这个就定义成这个可变类型的,可变的这个类型啊,就是定义成Y,不要定义成value不就完了吗。
05:10
但是我们现在是一个分布式系统啊,你如果要是这个当前这个状态还涉及到什么问题呢?哎,我在做来回做转换操作的时候,可能涉及到它的一个序列化反序列化的过程,对吧,特别是涉及到哎,我们现在要做这个,呃,状态一致性的保证,那可能。如果发生故障之后,我还需要从那个checkpoint存储的地方把它再拿出来,再恢复出来,你如果要是只是一个本地变量的话,那那这个当前这个我到底是按照什么类型去把它做这样的一个存储管理呢?那就不知道了,对吧?因为我们说flink里边是有自己的整个一套类型系统的嘛,所以你当前定义的这些所谓的这个本地变量啊,这些状态,如果你想让让让它有这个容错的管理,就是发生故障之后能够恢复的话,那你就必须用flink给我们提供的这一套状态管理机制把它管理起来啊,那那当然了,就是说如果说这一套机制我们自己来实现的话,它很麻烦,对吧,我也考虑它的这个序列化,反序列化,考虑他在那个做拆矿里的保存的时候,到底是怎么样去保存,对吧,怎么样一个行为,它还是分布式的对吧?呃,然后你这分布式的怎么样拼在一起,然后还有什么呢?就是有可能我们那个大家知道集群我一开始。
06:29
可能是三个并行度对吧,当前这个给并行度给了三,这个task有三个,呃,这个分布式的这个状态我都保存在拆point里了,那后来呢,我发现这个可能呃有点不够对吧,当前的这个并行度搞不定这个数据了,我我扩容了,我把这个相当于这个集群先停了,然后又从之前的那个保存的状态里边把它重启,重启起来之后呢,呃,这个啊,重启起来之后,我当前的这个这个任务数据,任务的这个个数就增大了,并行度变成四个了,如果要是有这样的一个变化的话,大家想想,那是不是就会涉及到我之前的这三份state怎么样去拼,拼起来之后再怎么样,因为你还想要负载均衡,对吧,怎么样再比较均匀平均的分配给后边我重启的这四个任务,然后让他们在之前基础上再分别去做计算,对吧?而这个就要考虑的问题就非常非常多了。而flink呢,给我们比。
07:29
层已经实现了这一一整套机制,它的状态管理机制可以给我们搞定这个状态一致性,对吧?故障处理的时候重启怎么样去重新加载,重新做反序列化去去恢复这个状态,还有就是整个状态的高效存储和访问,你去读写状态的时候到底怎么样去做处理,这些flink都已经帮我们搞定了,那这样的话我们就不用再去做这种比较底层的比较难受的事情了,对吧,你的我们作为开发人员,注意力就可以都放在业务逻辑的开发上了啊,这是关于flink当中状态的一个定义。
我来说两句