00:00
然后再给大家来讲一下这个状态后端,哎,这个状态后端又是什么东西呢?呃,因为大家会想到这个,我们前面讲了,既然是有状态吗?那是不是每一条数据来的时候,这个有状态的算子任务,它就会都都要去读取,然后要更新这个状态啊。啊,整个是有这样的过程的,对吧?啊,所以大家会想到,那那它这个读取和更新状态,这个状态到底是在哪儿呢?它从哪去读取这个状态呢。诶对,大家直接想到的就是说,那应该就是内存吧,因为大家自然能想到,就是说有效的这个状态状态访问,大家会想到这个我们要的是快,对吧,实时性要好,所以说快速有效的状态访问,对这个低延迟相当就是应该是一个至关重要的一个特性,我们肯定是要对它要访问要快,所以正常来讲,一般情况我们每个并行的任务都会在本地内存里边去维护自己的这个状态,确保能够快速的做这个状态访问。
01:10
那这里面大家就会就会注意到,那一定都是在本地内存里边去存这个状态吗。那大家会想到,假如说我们的内存不够用了,那怎么办呢?对吧,假如说我们这个状态特别特别大,你内存根本放不下,那又怎么办呢。哎,所以说在这个flink里边,它其实给我们提供了不同的。状态管理的工具,状态管理的方式,状态的存储、访问和维护,这些工作可以是由一个可插入的组件决定的,这个组件可以由我们自己来选择。这个组件在flink里边就叫做状态后端啊,就是英文名字叫state back。
02:02
呃,所以大家如果要是听到这样的一个概念的话,它其实就是用来管理我们整个flink程序里边所有的这个状态,它的存储、访问、维护啊,都是他来管的。另外,他还管一件事情,除了本地状态管理之外,他还管另外一件事情。还管什么呢?海管检查点就是所谓的checkpoint。因为大家之前我们给大家已经讲过,就是为了要保持这个容错性,为了保证在出现故障的时候能够恢复状态,对吧,保证这个正确处理数据,那么是不是定期应该把这个所有的状态做快照要存起来啊,哎,那他就自然会想到你存起来的这个东西往哪儿放呢?还是往内存吗?哎,当然可以还是往内存对吧?呃,但是大家翅想到你如果一直都往内存的话,呃,好像这个这个存起来的东西就有点儿不太靠谱对不对?哎,所以当然还是这个东西可能会放到一个单独的地方去,哎,所以这个。
03:08
所谓的检查点checkpoint,它有可能是要去写入到远程存储的啊,所以这一部分内容也是状态后端来管理的,好,那接下来给大家看一看,就是我们说。在flink里边可以去自定义去选择一个状态后端,那flink里边可以有哪些状态后端选择呢?现在给我们提供的有这样的三种选择。首先是memory state back end,那顾名思义,这就是内存级的状态后端啊,那简单来说,它就是把我们的这个监控状态啊,直接就全放到内存里边管起来了,对吧?啊,那它的存储是存在哪呢?具体来讲存在哪儿呢?是task manager的内存还是job manager的内存呢?对,就是我们平常的这个状态,每一个算子任务它的状态当然是谁干活就存在谁的那个本地内存,对不对啊,所以。
04:09
平常我们的这些状态啊,是直接存储在task manager的JVM堆上,直接就存在上面啊,那另外还有一个东西还得去存。我们做的那个checkpoint存在哪里呢?哦,这里大家注意,如果我们配置的是内存级的这个memory state back end的话,它的checkpoint也是存在内存中的,但是这个就不是在他task manager的本地内存了,而是哎,是一个远端的内存,是drop manager的内存了,也就放在drop manager的GVM堆上面了啊,所以大家可以认为这个,呃,它具体的存储结构大家可以认为就类似于一个,呃,就是一个一个Java对象对吧,直接就把它存进去了,呃,就比方说像我们的这个map it,呃,那直接就存成一个Java的哈,Sh map就可以了,对吧?啊就是这个,就它的特点是什么呢?他还想到这样有什么好处呢?
05:08
对,这个很容易想到太简,太容易想到了就快呗,你全放到内存里边,这访问当然是非踌了,延迟非常低,对吧?啊,这是它最明显的好处,那有没有坏处啊,对它这个当然坏处也很明显,就是对首先就是。一旦掉电怎么办,对吧,那掉电就全挂了对不对啊,那大家有有可能想到你task manager,那掉电我们没关系啊,掉我们不是还有checkpoint可以从checkpoint里边去恢复吗?对,大家会想到那你这个drop manager的那个checkpoint也是放在内存里面的,那这个当然掉电也就没了呀,啊所以当然它这个本身是呃,不够可靠,不够稳定的一个状态,另外还有什么问题呢?所有的状态都放在内存里边,哎,那如果要是说状态特别大的话,是不是就有可能会出现OM的问题啊,对吧?所以这种情况下你就得去自己去控制,自己去做管理了啊,这种情况就可能还是得自己考虑很多问题,另外就是说呃,你全放到我们的这个内存当中啊,作为这个抓va对象进行管理的话,那本身还会还会受到这个GC的影响,对不对,那很多状态它是会长时间长期存存在这个内存里边,堆内存里边,那当然这个呃,GC会会影响到它啊,所以所有的这些都。
06:39
都说明什么,都说明它快是快,但是如果真正要运行的时候不够稳定。那所以它一般用在什么场景啊。不重要的哦,有些同学可能就说,哎,它用在这个不重要的场景,那如果说我们到这个实际生产环境里边,你说有不重要的场景吧,已经上线对吧,一个一个这个所有的这个程序都已经上线了,所以都已经在这个实时处理了,你这个肯定肯定就都很重要了,对不对,那所以一般情况啊,这个内存级的状态后端呢,呃,不会在实际的生产环境里面用,它一般是我们做开发和测试的时候用这样的,对吧,快速响应的一个环境。
07:27
那我们实际生产环境里面用什么呢?啊,当然就是用后边的这两种了,第一种是FS state back end啊,从这个名名字上大家看FS是什么的,File system,对,所以是文件系统,它是这个把checkpoint会存到远程的持久化文件系统上啊,所以它是一个文件系统状态后端。诶,那这里边说是把checkpoint是存到远程的文件系统上了,那对于本地状态怎么存呢?诶这个大家要注意啊,本地状态还是跟这个memory state一样,把它直接存到task manager的GM堆上去了啊,那大自然可以想到就是它的这个特点又是什么呀?
08:15
快对它的特点其实也是也是快对吧,呃,就是就是本身这个内存级访问的时候啊,就是它也是内存级的访问速度也是非常处理起来非常快的,然后呢,另外一个就是说,假如说我们这个task manager挂了对吧,掉电了呃直接崩了,呃,那没关系,我们还可以从checkpoint的恢复,而checkpoint是有保证的,对不对啊,它是存到远程的这个文件系统上去了,所以这个其实一般情况生产环境里边,往往我们至少是要用这个文件系统这个级别的状态后端。诶,那大家自然会想到,那如像像这种情况,他有没有什么问题呢。
09:00
他有没有什么问题啊。呃呃,当然了,那大家会想到它,它有这个延迟的问题吗?大家想一下它的延迟主要是延迟在哪了呀?对,它其实是可能是做这个checkpoint去保存状态的时候延迟会更高对不对,但这个保存状态其实后面我们讲到checkpoint的话,大家会发现它其实对我们假如我们做这个异步的去存这个checkpoint的话,对我们正常处理本身的这个性能啊,其实影响是比较小的,对吧?啊,它并没有那么大的影响。那大家想他更大的一个问题,其实是在哪里啊,对,其实还是在本地状态这儿,对不对,那本地状态你还是存在内存里边,那是不是该OM的时候还会OM啊。那如果说要是遇到这个GC问题影响的时候,是不是还会受到影响啊,哎,所以这个问题其实还是没有解决,也就是说如果我们遇到超大规模的数据对吧,然后你有很多的这个状态需要去保存,状态非常非常大的时候,那这种场景你怎么样去处理呢?啊,那如果在这种状态下,我们可能考虑就要用另外一种更加啊这个重量级的这种状态后端了,那就是所谓的rocks DB state。
10:32
呃,大家知道这个rocks DB其实是一个一个k value存储介质,对吧,呃,它是大家可以认为是一种数据库了嘛,对吧,本地的一个数据库,所以它其实是干什么呢?它会把这个状态全部进行序列化,然后存入到本地的rocks DB里边。啊,所以大家看这种情况下是不是相当于你就随便存了呀,对吧,正常来讲的话,这个就相当于你你你这个就是相当于本地这个硬盘空间嘛,那基本上是足够大,一般情况在生产环境里边,你如果要是配成rocks DB back的话,基本上是够用,就一般不会出现说把这个呃,RODB的这个呃空间都都给撑爆了啊那那说明嗯,这个配置的机器这个性能太差了,对吧?啊就是一般情况这个还是足够用了,所以大家看这个在flink里边给我们提供了还是提供了这个不同的选择的,你可以用不同的方式针对不同的应用场景来做这样的选择。
11:37
好,这是这一部分,就是状态管理的这一部分内容,呃,当然就是这里边只是给大家简单的这么说一说,大家可能还是不是特别的清晰啊,所以我们还是简单的在代码里边看看这个step back到底怎么去做,呃,这里大家可以看到就是这个step back,我我们怎么去呃,设置这样的一个选择这样的一个back呢?呃,其实很简单啊,我可以怎么样直接env调这个。
12:08
大家看是不是有一个set step back end啊,是不是可以直接这么去设对吧?啊,这个把这个一设,这里边大家看我需要去传什么东西呢?当然这里边就得传一个stand back对吧?啊,所以这里边我其实要做的事情就是对,比方说我可以去new一个新的step land,那step land有什么情况,比方说我可以去拗一个对memory state。Back,我是不是可以直接去扭一个memories back end啊对吧?呃,大家看在这个环境里边,这个其实是呃,直接已经那个depre的对吧?呃,然后这里边另外我还可以去创建一个FS state back,对,这个也是一样的,对吧,当然这里边我我是不是必须得去传一个路径啊,对吧?你必须指定把它存到哪里,另外还可以定义这个rocks DB,诶,这里大家要注意啊,Rocks DB如果你要去引入这样的一个状态后端的话,你还必须。
13:21
引入第三方的依赖,就是直接在这个flink里边还还没有这个支持啊,所以大家可以看到就是还需要去做什么呢?选择一个状态后端啊,我们看一下,大家看要把这个flink sit back and rocks DB这个东西要引入,哎,所以我们可以把这个东西引进来之后。Dependency。好,大家看这个引入之后,Rocks DB state back end啊,现在就有了对吧?啊,那当然这里边也是得去需要把这个路径要传入的啊,所以这里边我就只是简单的给大家写这么一句,大家知道怎么用就可以了。另外需要跟大家说一点的是,就是如果说我们想要去就是使用这些东西配置this back,呃,大家会想到这相当于是需要去指定我们那个checkpoint存到哪里对吧?那默认情况下,其实我们这个代码里边checkpoint其实是不开启的。
14:28
大家其实发现之前我们根本没有配过check相相关的东西,对不对,那怎么样可以把这个checkpoint的开启呢?这个也很简单啊。大家看env可以直接enable checkpointing对吧?啊,然后这里边还得还得传参数,大家看,如果你什么都不传的话,大家看这个也是被弃用的一个状态啊,传参数传什么呢。大家看直接可以传一个interval,传一个浪就可以了,那这个代表什么啊,大家想对这是不是就是间隔多久去做一次checkpoint的操作啊,对吧,隔多久保存一下我们当前的这个状态,做一次快照啊,其实就是这样的一个事情啊,当然这个大家如果觉得一秒太太太那个短了的话,可以把这个调大一点对不对,比方说这个60秒一分钟一次,对吧?啊这个就是大家可以根据生产环境里边的这个实际情况去做一些调整啊,啊这就是这部分内容。
我来说两句