00:00
那么接下来我们看一下第二个章节,状态及切克调优。那这一块也是大家很呃不够重视,或者说呃。经常出现问题的一个地方,那首先这个切个抛,咱们知道它其实本质上就是对状态做一个备份,对吧?啊,那这中间比如说这是一个扇子。这个算子是携带状态的,它本地是不是得维护一份状态啊,我用圈圈表示好吧,圈圈啊,一个圈叉啊,这是本地状态,他在执行任务的过程中,是不是要读写本地状态。好,这是第一个瓶颈,瓶颈在哪呢?如果本地状态特别大怎么办?对吧,我们知道本地状态是不是由状态后端来决定的,管理在哪里对吧,那么有基于内存的,有基于RODB的。那我们知道用RODB的话,它是不是用本地磁盘空间呢?也就是说理论上它的状态大小是没有上限,是不是可以支持你特别特别大的状态,所以我们有一个关于DB的大状态调优。
01:08
啊,我们重点强调是大,那么接下来我们为了容错性的保证,这个本地的状态是不是可能丢失啊,那你恢复作业的时候。是不是就没了,所以他又有一个机制,是不是切抛运。这个po说白了是不是对我们这个本地状态,不管你是内在内存的也好,再RODB的也好,我是不是将它持久化到文件系统啊,那正常来讲咱们是把它持久化到HDFS啊。也就你作业出错了再启动,是不是可以从HDFS将数据状态的备份恢复到本地,那是不是本地状态又有了,那你是不是又可以继续读写了,对吧。也就是说咱们这个章节主要聊的第一个本地状态太大了,我该怎么来很好的去使用啊,效率高是从效率呢,还是从容量来考虑,第二个是呢,切个po,就是这个备份的频率对吧。
02:04
我。该怎么来考虑啊,就是这个章节大家要完成的事情。来,好,废话少说,咱们先来看看状态。基于存状态没什么好讲的,特点就是什么。缺点呢?就是。可能。它的一个存储的数据量大小比较受限,对吧。而且内存贵呀。也说如你有特别大的状态,比如说你动不就存一天甚至数的状呢,如果本身你企业里面你们的数据量特别大,一天呢,就是能达到好呃,达到T啊,达到PB啊,或者大几百个G啊。这种那。也比较建议用DB对吧,DB咱们其实跟有点像啊。它也是呃,基于这个lsm来实现的。
03:03
这个呢,咱们就不展开讲,但大家知道它的特点是什么,什么叫DB?来看这张图。他用到了什么内存?内存是用来什么缓冲的?缓存的。也就是说,诶,比如说这边是咱们的,呃,Task。那他要写状态怎么写呢?他所先把数据写到哪里啊,内存里边啊,你先别管里面这些东西,反正就要写内存之后呢,内存里的数据它会刷写,就flash。到哪呢,本地的磁盘就是你的硬盘上面。啊,你服务器上的硬盘磁盘上面。那这样的话就是说,即使你这中间产生非常非需要很大的数据量,它是不是最终都是落盘的呀。对吧,所以。大状态的时候,咱们用Rose TV。啊,这也就是它的机制啊,有一块缓存,然后再刷到磁盘,大家明白这一点。
04:05
另外它跟h base一样,每次读数据如果都从本地磁盘读的话,效率就太低了,所以他会先从什么,先尝试着从block catch,也就它的缓存里面去查一下,如果没有再去查磁盘。对吧,所以这也是一个取舍吧,大家也知道,所以它的读写,特别是读写读的效率是不是肯定比那个基于内存的状态。存内存的那个状态要慢一点,也就它的效率会低那么一点点。那到底低多少就看你怎么用了啊。另外它的可以存多大的状态,理论上你的磁盘本地磁盘有多大,它是不是可以用多大对吧。哎,它的瓶颈主要就是一个读请求啊,另外大家要知道他写的操作都必须进行一个序列化跟反序列化。因为它里面存的是什么呢?存的是一个二进是那个字节数组。
05:03
就拜。那你读回来就要反序列化,写的时候要序列化,读的时候要反序列化。所以呢啊,咱们怎么来用好RODB啊,咱们要来聊一聊,那首先第一个呢,咱们在介绍其他调优措施之前。你总得知道他现在到底是好还是差呗。你不能光从你自己的感觉哦,你说他不行他就不行吗?那不一定啊,所以咱们呃,在一三版本flink加入了一个状态访问的什么性能监控,咱们根据这个性能监控我们就能看到,诶我当前这个用RODB,它状态的一个读写性能怎么样?当然这边主要是一个啊。另外呢,它这个功能不仅仅是说。我们现有的状态后端你自定义也行啊,说白了就是。
06:03
都能监控到啊。另外大家要注意这个监控的状态监控啊。它会产生一定的性能影响,这个大家想都不想,因为你多做了一些事情,对不对啊,你要多做一些事,肯定有性能影响,所以呢,默认它也不会采集频率特别高,它是每100次做一次取样啊。那具体损失呢?啊,对DB来讲,这种状态后端损性能损失大概在1%,那如果是内存的状态后端它损失最多可达10%,因为其实你。你说诶诺DB好像很强的样子,其实不是,这个东西很好理解,我举一个例子,大家想一想,他们好几年经常说程序员对吧,说什么一跳槽薪资翻倍。你不能光看比例对不对,如果你本来税前一个月薪达到了10万。
07:02
那你说你的涨幅达到1%。那是不是也很可观?当然你对对对人来讲可能无所谓啊,那如果你本来只有5000块钱,你说涨幅达到了惊人的100%,那你不也才涨5000吗?对吧啊。那反过来看,这个看起来好像DB性能损失低,呃,内存损失。高,为什么?因为你DB相对内存慢一点嘛。对吧,那你性能损失这一块对我来讲其实差不多啊,但是内存本来很快,你稍微拖一下后腿就。感觉损失很多了,行,这个不啰嗦啊,咱们直接动手来做一做,呃,怎么开启呢,默认是不开的,咱们要加几个参数啊。这个。他这边有四个参数啊,那正常来讲咱们开第一个就行,其他的是调整的一个是采样间隔啊,每多少呃,就每几次做一次取样嘛,对吧,默认100。
08:09
不用调,还有这个直方图的一个大小128就默认就行了,还有这个将状态变做状态名,当做变量名啊,这无所谓啊,正常就开这个就行。好。呃,实际动手给大家演示一下吧。他们是不是指定这个参数啊你。不用去配置文件改。配置文件的话。不用设默认的,咱们怎么样提交参数里面再给他加一行看大D,然后这个玩意儿等于to。那不就行了吗?对吧,来试一下。当然这个功能是一三才有的啊,当然flink,嗯,大家也可以看到,这两年它的更新频率是特别特别快的,而且它新增的很多新特性都是很有用的。
09:11
就还是很值得去,呃,做一个升级的啊。来,咱们打开最新提交的这个。页面web UI,而且你看它web UI这么好用,对吧,加了很多功能,呃,咱们随便点个扇子。有状态的啊,比如说这个要ID。Matchtrees。然后呢,咱们找一下,诶,你看这边就多了很多这种。你看。theatre.wIgE state这个是什么呢?这个是我定义的状态名,给大家看一下theater theat应该是这个。
10:00
Yeah。这是我定义的一个,你看直状态value date是一个面,保存的是每个mid的首次访问时间。说白了,这是不是一个变量名啊?呃,那个状态名啊,然后呢,接下来是value date对吧,类型,然后呢,Get是读取。Update还有更新的一个延迟情况,还看看有什么没了吧,更新就是写吗?对吧。来这边点开,呃,放大。这个是什么max?因为大家可以看到刚才其实很多的啊。你看零编号。零号任务,你看光是这个get看起来是不是有很多个对吧。那我再点一个。大家看一下,它有很多种,一个叫麦克斯,一个叫什么?是不是中间值啊。对吧。
11:01
它是很多维度指标给我们去分析的,来Y。State。再get一个。还有最小值,看到没有。也就是说当前子零号子任务,然后呢,这个。叫做这个名字的状态,它去读get是读,读的时候最大延迟是多少,中间延迟是多少,最小延迟是多少,那还有一些呃,大家不一定会看的是什么呢?Menu state,有些人可能没接触过这个带P的啊,这是分位值,比如说P75。什么意思呢?它是将所有的采集数据按从小到大排序。比如说举个例子,你有12345没。啊,1234吧,这么四个。采集了四个数。然后呢,从小到大排序。P75就是取75%的位置。
12:00
不是只取75%啊,是位置取75%,那你算算位置75%是多少?这里是25%。这里是50%,这里是75%。也就是说它取从小到大排序D75%位置的那个值。这是P75,那对应的你可以还可以看到什么P99 p25P50,还有一个特殊的叫P999。P99是99%,P999是99.9%。啊,这是一个常识啊。而言之言,总之我们大概看一眼啊。你不要点这个nu,你说我的天延迟达到了一分钟。对吧,你再点这个最小,呃,中间值四秒钟,再点这个最小值两秒钟。你是不是疯了?一次读请求按秒来计算了,那你这个延迟高的吓人呢?不是的。
13:02
大家注意,它这个自动转成数字带单位的,它是按毫秒来计算的,它默认你这个数数字是毫秒,那么大家注意看一下当前数字是多少。最大是不是达到了7万呢?低ne呢,Tne是不是四个零,如果你按毫秒来算,是不是就70秒,就一分多钟对吧,那不是它的单位是那个纳秒。纳秒。纳秒是什么?毫秒。呃,一纳秒是不是等于1000微秒?对吧,1000微秒是不是应该等于100万毫秒。啊,不是反了啊啊说说说说反了,然后写这吧啊。一毫秒等于1000微秒,然后是不是等于纳秒?
14:01
对吧。也就是说这个是1000倍,再到这再1000倍啊,它的计算单位是用的DK的那个nano t。来取的值啊拉太。所以呢,咱们这个并不是那么高,你要除以六个零才是毫秒嘛,对不对啊。即使再怎么样也最次也是什么微。所以这个你看看几万,我们算一下吧。1万除以六个零是不是0.07毫秒?没问题吧,这四个零移四位,再移一位,再移一位,对0.07毫秒,也就是说其实咱们最大是0.07毫秒啊。你你你不要直接点这么点啊,我就是再提醒一下啊,那后面这些都一样啊,都一样。
15:03
这个就可以看到咱们的一个延迟情况,那么如果你发现这个延迟情况明显呢,比如说达到了一两行。呃,平均或者说通过你的判断最大呢,或者平均值呢,或者P75P99什么的,达到了什么十毫秒,那肯定有问题了,十毫秒说实话有点高啊,或者说太高。这个就是一个它的性能监控啊,要加参数才能开启啊加参数。
我来说两句