00:00
好,那接下来利用这个监控项去确定这个反压的位置,其实刚才我们也说了啊,吞吐量的时候对吧,在这里边呢,可以去看监控项,监控项里边到底是呃,它的一个进口满了还是出口满了。对吧,如果它的一个只是进口满了,出口没问题啊,输出out,刚才我们看到in po和out po嘛,对吧,那如果只是进口满了,出口没满,那就自己处理不过来了,就自理这个任务,那如果是出口满了。出口满了对吧?呃,那这个时候往往是下游出了问题,下游出了问题对吧?啊,下游的处理不过来了,我发不出去了嘛啊,下游不让我发了啊,那往往这样的啊,可以利用这个inport use,就这个就这个参数inport跟out来定位。对吧,啊来定位好,那在这个当中呢,我们去知道一下反压的一个原因,对吧,我们找到了反压,也找到这个任务,那么到底是什么原因导致的呢?那第一个很重要的原因资源。
01:08
对吧,系统的资源导致的你资源不够对吧,你没做这个压测啊,本来是50兆每秒的最高峰,可能你当前配置的这个什么。资源只能够使用什么呢?只能够应接应对,最大的内存是20兆每秒,那你50兆每秒的数据来了,那必然会产生反应,对吧,而且所有人都产生反压,所以第一个问题就是资源还是资源,对吧?所以一定要在我们运营任务之前做什么呢?做压测。啊,作为压力测试,保证你的资源跟你的最高峰,它是OK的,能够扛得住你高峰压力的,对吧,那这个时候往往都不会由由于资源来引起这个问题了啊,当然。这是最简单的一个方式啊,你你跟他说,你说遇到反压的时候,其实没有遇到过全局的这种反压,因为我每一次做任务之前,对吧,我们会评估这个最高峰,然后用最高峰去做一个压测啊,所以呢,它不会由于这个数据量过高导致我们的一个反压啊,除非是什么呢?呃,有可能。
02:22
是618双11这种的时候,因为你不可能说平时测这个压测的时候,对吧,拿着双11或者618的这个数据量来测,对吧,那这个时候呢,好产生一个反压是有可能的,对吧?第一个是系统资源,呃,那这里面呢,介绍了看这个工具啊,看这个工具,那这个呢,就是还是得大家学过这个Java啊,那这个呢,我们去了解一下吧。所谓的这个火焰图。所以我们跟大家介绍一下,他看什么东西,我们打开两个啊,还有一个。一个是第一个这个是介绍火焰图怎么用对吧,线图怎么用,第二个是火线图的一个介绍说明对吧,那这边Li可以用这个内容来做这个事啊,火原图啊,在flink当中呢,我们。
03:12
这个还要登录吗?我看一下啊。还要扫码,我应该是啊,稍等我扫一下吧。嗯。我扫了之后。他没有验证码呀。他让我们提交一个验证码是吗?啊,发送这个致声啊发送。现在这个东西搞得越来越麻烦了,以前可以随便看的。
04:04
制胜是吧。好,那。收割赚钱啊,就越来越恶心了啊,我这边也扫了,我这边也扫了,扫过了,对好,那这个地方呢,就是说用Java的一个工具对吧,首先呢,他告诉你如何去下载安装啊,去编译,编译好之后呢,更重要的是在flink启动任务的时候要加上这个参数。要加这么个参数对吧,之前我们指定的时候要加一个参数来运行,对吧,然后运行一个link的一个作业之后,在日志里边就会打印很多的这个日志。啊,打印这个日志,然后之后呢,我们可以把这个日志拷出来啊,这边有一个下载啊。对吧,右边有个下载啊,就比方说我们从这来看吧,呃,在task manager站里边,比方说啊,它会在这儿会打印很多的日志啊,打印日志当然我们这没有对吧?啊打印日志之后呢,这边有一个什么刷新和下载,你可以把它下下来,下下来,下下来之后呢,可以用我们的工具做一个解析。
05:13
用这个工具做一个解析啊,然后呢,解析之后打开就变成这样的一个图形。变量图形叫火焰图。对吧,好,但是这个文章呢,讲的是如何去使用,一步一步的教你去用对吧?好,那接下来这个火线土长这个鬼样子,那谁能看得懂呢,对吧,那第二篇文章啊,知乎也让你扫码对吧?啊然后这个别文章呢,教我们去如何去看这个火焰图,那其实这个地方呢,它是CPU的一个耗时啊,所谓的CPU耗时呢,比方说啊,我们看这个图能看得清楚一点,这个图呢,看啊这个正么长的一个条。代表了CPU的耗时,而而且呢,从上往下看啊,这个下面往上看啊,这样看它是调用关系。
06:01
调用关系,也就是说在这个方法里边可能调用了这个方法对吧,执行了这么久,然后这个方法呢,又调用了其他的,又调用了其他的,一直调用调用对吧,返回,然后呢,有可能这个方法又调用了第二个方法,然后调用它,用它对吧,然后这个方法又调用了它每一个方法的,或者说什么样的一个耗时。大啊,是这个内容好,那按正常来说,底下的粗,上面的细对吧,那如果说这个里边一般什么时候会发生什么问题呢?如果说你看的都是尖尖的火焰嘛,它就是上面尖对吧,如果说你看到的上面是这种平顶的啊,就跟大家说一下,它什么时候会是问题的。对吧,呃,这边平顶平顶就可能有问题,因为我们正常的调用对吧,调用关系函数调用关系我调一个函数,然后呢,你也调函数对吧,你可能调两个。掉两个对吧,然后呢,你也掉了一个,你呢也掉一个,掉一个函数,这样的你也掉了第二个函数对吧,然后第二个函数呢,又掉其他的函数,但是不是越高越细呀。
07:10
对吧,越高越细好,那假如说有一个这样的东西,我当前这个方法调用它,它呢也是一个这样的东西,比你跟我时间一样,也就是说我当年这个方法的时间就完全取决于你了。对吧,跟你一样几乎一样,那这个就所谓的平顶,那往往来说这个函数就可能存在一个问题。CD放满。对吧,我们可以通过这种方式来定位啊,来定位点击放大对吧,这个就是一个平顶,这个明显就是个尖顶。对吧,这就是尖顶啊,就是这块平顶这个呢,就平顶往往呢,这个里边出了问题,所以定位到这个方法啊,定位到方法那你调用时间长,那你就看这个方法是本身就是时间长还是什么样子。对吧,那如果说他不应该是时间长的一个方法,然后呢,时间长,那你看一看这个系统的其他的资源的一个瓶颈啊等等的,对吧,是这个意思啊,针对于这个算子去做优化,因为你可以看到到底是哪一个方法出了问题嘛,对吧,你看一下这个方法里边是不是你写了东西不对。
08:12
啊,还是说真的就是资源不足啊,数据量太大了,资源不足这个都可以分析的出来,因为像这个火焰图呢,它已经细到方法层面了,调用关系全部都给你展示出来了,对吧,这是第一个系统资源,往往来说呢,我们调高资源就够了啊,第二个垃圾回收GC对吧,因为做垃圾回收的时候呢,特别是负GC。他是做不了其他事的,世界是停止的,900分的世界是停止的,对吧?那如果是频繁的做这个GC,那也会导致这个系统的性能,对吧?我处理不过来,最后呢,不就产生反压了吗?反压不就是因为数据处理不过来,然后呢,放到这个内存当中,一直放着一直放着,然后出问题了,对吧?是这个事情啊好,那所以呢,有这个垃圾回收,我们也可以启动任务的时候呢,加一个什么样的一个参数,对吧?然后呢,也是一样的,加了这个参数运行之后呢,他也会在我们的日志当中打印一些,把它下载下来,下载下来以后呢,可以通过。
09:09
叫g c view来分析这个数据。好,来分析我们的数据啊,当然了,这边呃,大家我之前也提示过大家一定要去。在工作当中做开发的时候啊,一定要看。GM和GC这两这两个课程一定要去学的,因为我们都是属于Java系的程序,那你这JJMJOC对吧,这是并发编程包啊,那JM本身的东西你肯定要去了解的,这个我们就不细去看了,诶大家对于这个M跟C的课程都没上过对吧?啊,所以呢,我只是给大家一个建议,所你一定要去学习这两个东西啊,学习这两个东西,这个工具呢,那打开也看不懂了。对吧,啊,没没学过这个,但是大家基本的东西应该知道对不对,像JA我们当中。
10:06
有哪些概念啊?你能说说出来几个名词吗?有哪些概念?不知道是吗?不知道算了啊,不知道算了,呃,那还有可能的原因是这个CPU线程平定啊,那当然这个还是资源问题,包括线程竞争对吧,他还是这个资源问题。啊,还是资源问题好,那么接下来还有一个负载不平衡,注意这个。非常重要的一个点,这个是属于什么呢?数据倾斜,那关于它的问题,如果是数据倾斜产生了反应,那往往跟我们看到的现象就是这样,好多都是绿的,对吧,大家都没问题,没有反压,就是这个啊在这边。就是。
11:00
来到这边来产生反应,好来我们刷新一下,那这边呢,还有两个任务对吧,两个都是绿的,我们这儿肯定不会产生反应啊,两个都是绿的对吧,那如果说一红一绿。个红的,一个绿的,或者说我有十个任务有一个红的,大家都是绿的,那这个往往都是来自于负载不均衡,也就是说数据倾斜。啊,数据信息,那我们下一章啊,第三章整个的就是聊的数据信息问题啊,所以呢,现在我们就不聊了,怎么去解决这个问题,对吧,还有外部依赖,那如果说我们在map函数当中或者其他函数当中,我们怎么样使用了外部系统,那必然。会慢。对吧,这点我们测试的啊,那你数据源源不断的过来,但是我访问一条数据外面很慢啊,一毫秒或者十几毫秒。那明显我一秒钟处理的数据量就降下来了,对吧,很有可能产生的这个反压,那这个问题我们是不是也会解决啊,怎么解决,如果是外部依赖导致的问题导致了反压,我们应该如何解决这个问题?
12:10
嗯,这个问题怎么解决?哎,对了啊,旁路缓存加异步IO吧,对吧?啊,如果说你发现在里边呢,是map这个函数里边对吧,假如说map这个函数产生了反应,哎,你发现当前这个函数map函数呢,它本来应该很简单,但是在map函数当中发现它使用了连接,诶访问了red,访问了这个,呃,访问了其他的框架,访问了my circle,对吧,那往往这个时候呢,它可能会产生这个反压啊,我们可以用这个盘缓存加异步查询的方式来解决这个问题。
13:00
对吧,啊可以很轻松的解决到这个问题,因为加速嘛,加速查询,因为这个没办法,外部系统它这个往往往往来说,我们当时看了官网,他说了,往往来说呢,这个时候它的一个系统整个任务的一个瓶颈就是在跟外部系统访问的时间上面。对吧,非常高啊,延迟非常高,所以导致会导致这样的一个问题啊,好,这是我们所看到外部依赖,当然了,这里边儿主要的分为三类,一类资源。这个讲的都是资源吧,对吧,可以用各种工具去看这个资源,当然其实最好的方式就是启动任务之前我先做什么压测。我先做压力测试对吧,用压力测试来保证我们资源给的是足够的啊,那这个资源一般是不会有问题,另外的就是资源虽然没问题,但有可能呢,我们。有负载均衡对吧,有有这个负载不均衡,有数据吸血情况,有外部系统访问。
14:01
对吧,那这是两个不同的数据细节和外部系统啊,那数据细节怎么解决,那到第三章我们来解决外部依赖,我们知道对吧,上面的我们知道加机器嘛,上面这四个就是加机器。对吧,而外部依赖呢,我们可以用同路缓存加异步IO的方式来处理和反压,对吧?所以你现在呢,掌握了三种铜的处理反压的一个方式,要针对于每一种情况去用啊,不是说它三种直接用就完了,明明是数据倾斜了,你说庞论缓存加E100O这个对吗?那这个肯定就不行了,对吧?啊,所以说你得知道它是什么原因导致的,然后再去做这事,那至于它是什么原因导致的,我们是不是可以通过外BUI或者说监控啊,普罗米修斯来找到,诶,他有没有产生这个反压,到底是单个任务产生反压还是多个任务好,那如果单个任务也好,多个任务也好,到底是哪一个算子产生了反压,我们是不是知道,如果这个算子刚好是K败之后的一个算子啊,那很有可能就是这个数据倾斜了啊,然后你再结合反压是单个sub task反压了,而不是多个sub task同时反压,对吧?啊结合这些条件一样的,就跟我们之前所说的方式。
15:20
这样的方式。压测产生一个多少秒数据,应该怎么做还是不太清楚,哎呀,我服了。我们不有生成数据的那个脚本吗?那个脚本当中你可以设置一毫秒或者说十秒,十毫秒产生一条数据可以吧,假如说我设置的是十毫秒产生一条数据。你可以设这个线程睡眠嘛,对吧,睡十毫秒,那一秒钟呢,产生100条。产生100条,那我们用enrix做负载均衡的,那我能不能同时让很多个。
16:02
脚本同时启动对吧,十个,假如说我十个同时起,那不就1000条每秒了。每条数据大小,那不是你自己决定的吗?你造的数据。我说了是,我是不是说了你自己写数据造的脚本去做测试,你自己造的脚本,你不知道一条数据多大吗?
我来说两句