00:00
好了,那么前面大家学会了怎么来定位反压的节点,那么接下来我们就是要聊一聊一般反压的原因及处理啊,怎么来处理呢?那首先法尼亚有这么几种情况啊,给大家简单分析一下,首先第一个数据倾斜。倾斜了啊,这个也是不可避免的啊,不是不可避免也很常见啊,那第二种呢。是资源不够。并行度太低啊,处理不及时啊,内存太少啊,不够用啊,都有可能这是资源问题,第三种呢,可能是你长时间的GC对吧。大家知道GC里面是不是有一个负GC啊。咱们是不是有老年带跟年轻代老年带的对象是不是,呃,一般不会被清除啊。如果咱们负G,并且每次GC还剩下老年代还一大堆的话,那慢慢慢慢的就就就爆了。而且呢,会频繁触发G。而且呢,对象都回收不掉啊,这就是有问题的。
01:02
在负GC要停止嘛,要停止它的,呃,运行它专心的去打扫,那这个时候就可能引起反应啊,也就说白了就是可能是GC问题嘛,啊GC。另外一个原因很可能的就是比如说你的代码里面说是要think到呃h base啊,S到my circle啊,Think到click house,我们说了你flink自己又快。又好,但是你得考虑别人受不受得了是吧,那这种跟外部系统交互也可能,呃是一个反压的根源所在,这这是咱们一般上来讲碰到的反压原因还有一块就是太差了啊,代码写的效率太低了,性能太差。你的代码需要优化,也有可能或者说你不小心写了一个递归死循环。都有可能好,那咱们分析的思路一般是这样,先从最好找的找起,第一个先看反,呃,有没有倾斜,来举个例子,咱们看刚才的任务我没停啊。
02:04
通过咱们刚才的定位,他是不是罪魁祸首啊?对吧,来来再来回忆一遍,看一下matrix应该还在啊,完了我刷新页面了。呃,反正刚才我们是看到了对吧,而且咱不再看了,反正看过了啊,前面这些都反了,前面这个也反了啊,他是第一个OK的,咱们刚才word UI也好,还还是通过那个matres也好,咱们都看到,那接下来你点一下看一下有没有倾斜看一下这里。萨。这边呢,咱们能看到他接收的数据量跟数据条数,还有发送的数据量跟数据条数,来,我缩放一下页面啊来。发送。大小发送的条数,那我们可以看到它是并行度是五,有五个实例啊,那你看是不是有一个比较那个。这是什么?
03:02
已经接近呃47个G了,但是其他的子任务,其他的任务才是多少两个多G,这个很明显嘛,这是什么数据清晰。啊,也就是说其实咱们这个案例是由倾斜引起的啊。你看,那你现在一定到倾斜问题,接下来要做的就是我要将倾斜的问题解决掉。那么至于数据倾斜这个话题呢?咱们留到下后面来一起分析啊。这是如果是先看一下,第一步看一下是不是倾斜的问题。那第一步呢,如果不是倾斜啊,也就是说刚才不是咱们这个案例没有倾斜,看起来还比较均匀,没有倾斜,接下来你就要分析它的性能瓶颈。这个时候要介绍一个东西叫火焰图,咱们其实不仅仅是flink,其他的你应用程序,还有其他框架火焰图。是一个很好用的东西,那首先咱们要做一个叫CPU profile,或者有的叫j vm profile,就是。
04:02
它会统计你的现成的JMCPU的运行情况。啊,主要是CP,比如说你的当前线主要是哪些在运行,然后呢,运行了多久,调用是怎么样啊,有没有阻塞等等线程的运行情况,那你光看那些。冷冰冰的数据,你可能也不好分析,所以呢,咱们会结合。一些。这种工具将把把它可视化出来。那以前呢?一三版本以前这个事儿需要你自己去做啊,所谓的什么CPU profile也要自己去整。可视化也要自己整。但是一三版本。啊,他就为了方便大家,就直接在web UI集成了这个火焰功能,很简单。咱们只需要一个参数来开启就行了。大家注意这个是一三版本才有的,你如果版本比较老,你就老老实实自己弄啊呃,把它开启之后。
05:04
来咱们看一下这个。啊,我现在没开启对吧。啊,比如说这里,你看这里就有这个标签了,叫啊,那我现在点开看有没有。我这个好像没开啊。没开那你就看不到了,诶有啊。啊,看见了是吧,来它默认开启的话,咱们看一下是这个就是所谓的火焰图。对吧,是不是跟火焰一样,颜色有深有浅,那么大家注意第一点,怎么看这个火焰图啊,然后把它缩放出来。第一个呢,它的颜色没有意义。也就是说你看到这个颜色深一点,这个浅一点没有意义,第二一个怎么来看这张图呢,诶他怎么还不缩放开啊。呃,我们先看怎么从下往上看,这个是什么调用账。
06:02
也就是说什么意思呢?哎,他们执行了这个方法之后,调用了这个方法,再之后调用了这个方法,再之后调用了这个方法,再之后调用了它,再之后调用了它它它然后这个呢,又调用它,就一层一层调用,那接下来咱们纵向看什么。看最顶上的。被顶上的就是当前正在运行的线程。也就是说看罪啊,现在已经说放开了啊,就是看这里。每一个的最顶上。最顶上就是当前正在跑的县城,那接下来我们看横向,横向是什么意思啊?横向呢,是它采集在采集样本当中出现的次数。很难理解大白话来讲就是什么,你可以理解为就是执行的时长。那你看最顶层的线程是不是一直在跑啊,所以它是拉满的,你看到没有,但是它层层调用,层层调用,那到底是谁让它一直在跑呢?来往上看。
07:06
所以接下来你要找什么哦,最上面这一层里面。比较长的那些东西,你看这个时候比较长。很明显吧。对吧,那其他的还有谁长没有了,就他最长。第一呢,分析不出单,你看一下第二场对吧。总而言之,火焰图纸看什么最顶层就够了。啊,这里呢,正在跑的,其次看什么横向的长度,长度越长说明它占用的时间越长,就呃,主要是他在干活呢。你看他又刷新,这是在实时更新的啊,你看六秒钟之前。那比如说咱们刚才是不是看到他长啊,这个是什么。哈西扣的,再往下看一下,序列化,序列化序列化,其实这个东西如果有经验,你一下就看出来了,他在干嘛。是不是?
08:00
呃,传输数据,还有那个分组相关的事儿啊,对吧,那么看看这些都不够长。你再往上找,往上找,往上找对吧,看他都在做什么事情啊。点一下啊。好了,这是第一个啊,咱们来看第二一个介绍一下,他这边提供的功能有三个标签,第一个呢,On呢。是运行中的,用来查看一些运行中的一些线程,Off呢查看的是一些阻塞。因为有些线是不是可能要等待要阻塞啊,就是看这种情况,它不再使用,它属于等待状态,第三个就是混合状态啊,我们点一下off。啊,这些都是等待中的阻塞。的线程,阻塞的线程。那正常来讲,看的更多的还是这个on这里啊这里。
09:08
好,那这一块你就知道是哪一块在耗时间了啊,你就顺着找到最长,你顺着调用站找,如果一下不出来,你顺着往上走对吧。啊,正常是可以,另外呢。咱们这边我也写了,就是这个on跟off,你要学会看。报复有时候也可能是引起的原因,比如说你写了一个呃,啊。太频繁的sleep,那可能你看off这边就能看出来。火焰图,那这个参数呢,你去把它开启就可以了。
我来说两句