00:00
好了同学们啊,那我们学完这个延伸维度和这个聚合组以后呢,那咱们接下来看一下咱们这个5.3章节啊,叫Q5的一个构建参数调优啊,这一张啊,可都是满满的干货,我们一起来看一下啊,因为啊在这个K04里边,我们这个Q补构件,它这个作业一共分为两个步骤,第一步就是检测咱们这个Q补构建的一个原文件啊,叫做资源探测是吧,第二步呢,就是构建快照表,如果需要的情况下,然后第二,然后呢,就是生成全字典,也是如果需要的情况下,并且我将你的Q补数据我构建为我的part文件,也就是说我们一共分两大步,第一步是资源探测。啊,就探测一下啊,咱们这个QB构建需要哪些源文件啊,第二步我就是构建我所有东西了啊,也就是说我这一次构建啊,我的QB数据啊,我的全民字典啊,还有我的这个维度快照表,我都需要给它构建出来啊,由于由于在这个第二步中,我所有的计算都是相对相对比较重的我这么一个负载的操作,因此啊,除了使用咱们上面讲的延伸维度和咱们这个聚合组,我来减少我QQ数量。
01:06
而咱们咱们这个第二步里边啊,我如果能够使用正确的一个SPA资源和这个配置也是相当重要的,对于咱们这个构建客服来讲,所以说啊,本节中给他讲了三个关键点啊,就是如何设置咱们这个SPA参数,提高咱们这个QB的一个构建性能。那咱们这个三节,咱们这个5.3章节是分三个步骤啊,第一步,第一步就是设置适合适的SPA资源来构建客户啊,第二步就是使用咱们这个全局字典来构建啊,就是性能调优,好吧,第三步就是使用咱们这个维度快招表,那咱们先来看第一步啊,第一步里边就给他讲到咱们这个适用适当的SPA资源和这个配置来构建咱们的Q补,好吧,也就是说啊,在咱们的这个K里边。咱们这个Spark构建引擎,它也是由一堆参数来控制的,哎,它的这个参数的开头全部都叫K in.engine.spa com啊,大家可以打开这个配置文件简单看一下,好吧,那咱们接下来来到这个king的安装目录,有一个com目录是吧,我们VM打开咱们这个king点。
02:13
在咱们这个K里purpose里边是吧,你往上翻就能够找到咱们这个构建引擎,哎,它所有的一些参数啊,这些参数啊,我们简单来解析一下好吧,第一个啊,就咱们构建引擎Spark任务它的一个模式,那肯定是雅安模式,并且啊,它还是一个雅安的client的模式啊,当然这都是默认值,好吧,你想改可以改,OK,再往下啊,我们牙就是构建,构建咱们这个任务的一个牙的队列,我可以用depot,这也是默认值,然后再往下啊,就是一堆参数了。我的一个esor核心数啊,Eecor内存,Eecor实例数量啊,Eecor对外内存,然后driver核心数是吧,Driver内存,Driver的对外内存啊,包括是一个沙否的一个服务是吧,然后呢,再往下就是一个什么even的log,这是咱们的一个,呃,历史服务器,这个不用管它好吧,那咱们接下来就来看一下这个文档,咱们这个文档也是把几个比较重要参数我给你挑出来了,那咱们接下来在这个章节啊,5.3.1,这章节就是围绕这几个参数来讲的,那第一个就是咱们这个inor,它的个它的一个实例数量,就是咱们这个构建咱们这一个任务,它的一个Spark应用程序,我将来要用几个QT啊去构建。
03:28
好吧,嗯,就去计算。第二个就是咱们这个ex一个核心数,就是我每个ex使用的一个核心数啊,而我这个excu数量乘以咱们这每个核心数啊,就是咱们这个SPA程序它能运行的最大的一个并行度,好吧,那咱们这个memory就是每个CU存内存啊,Memory overhead就是每个CU使用的一个多内存啊,学过这个Spark的同学应该都知道,咱们这个Spark可以用对内内存,也可以用这个对外内存,好吧,那再往下啊,就是咱们的这个Spark它的一个什么呀,就是读取文件时,我要打包到单个分区内的这么一个最大字节数啊,默认值是一百十八兆。
04:09
如果咱们那个have务源表里边有许多小文件是吧,我这个Spark会自动把这个小文件打包到一个单个分区,以避免我执行太多小任务,就咱们这个SPA程序啊,在读取咱们这个have原文原文件的时候啊,它有这么一个打自动打包这么一个功能,那这个那这个参数就可以设置你这个打包的这么一个单个分区的一个最大字节数啊,它它默认值128兆,就是它可以合并小文件呗,把多个小文件是吧,合并成一百一百二十八兆去做计算啊,在咱们这个128兆,就咱们的这个HDFS的一个块大小是这样的啊,那最后一个参数就是咱们的这个Spark程序在杀浮过程中,它的一个最大分均数。啊,就是配置为这个join或者是那个go by聚合的时候,咱们那个沙uffle要使得有一个分均数啊,默认值200,这个跟咱们那个SPA也是同步的是吧?如果说你在设置比较大,那我会需要更多的CPU资源,那如果说你设置比较小啊,也就是说我这个分区数比较小,那我这个单个分区用的内存就比较大,是这样的啊,就是它的一个并发度呗。OK,那么接下来先看第一步。
05:16
咱们这个K在做这个Q部构建之前,它会根据你的QB情况自动来设置这些参数。那咱们接下来就要看一看啊,它是怎么设置的,好吧,就是它有一个自动的一个分配规则,K04.0将使用以下的分配规则来自动设置咱们这个SPA资源,而我所有的SPA资源和配置啊,都是根据语言文件中你这个最大文件的一个大小,以及咱们这个Q补是否需要准确驱重,什么叫驱重啊,也就是说啊,在你这个客户里边,你的那个度量值是否有那个count distinct,如果有那个count distinct是吧,那咱们这个这个要求会高一些,哎,其实啊,这就是为什么咱们这个第一步需要做那么一个资源探测,也就是说啊,我这个CU补在构建的时候,我的第一步就是进行资源探测,来看一看我当前这个QB需要设置哪些参数,好吧,那我们都设计什么呀,首先第一步啊,我们要设置咱们这个S它的一个内存规则。
06:16
我们来看一下啊,那咱们这个EQ内存,那我这个K04.0是怎么设置的呢?首先啊,它有这么四个档位啊,应该是有五个档位,我们看看这每个档位是什么好吧,第一个档位啊,就是如果说你Q补里边最大文件大小,它的一个单个文件大于等于了100G,并且你这个客户里边还出现了准确去除这么一个多量值,就那个抗S,那我们这个档位比较大,第一个单位。那既然是吧,你的你的这个呃,文件内,那文件又大,然后我还需要准确去重,所以说这个时候啊,咱们这个kill会自动把咱们这个eor执行内存设置为20G,这是第一档啊,第一个档位最大一个档位啊,那我们再往下啊,咱们依次往下是这个降档啊,那我们看下第二档,这个第二档什么意思。
07:04
如果说你这个Q部里边最大文件大小是大于等于100G,但是呢,你没有主线驱重啊或者什么呀,或者你的最大文件大小大于等于10G,哎,并且我有这么一个准确去乘这么一个多量值,那这个时候啊,咱们这个呃,K04.0会自动设置咱们这个内存为16G是吧?是eec的内存为16G。那再往下一个档位呢,如果咱们这个最大位针大小是吧,大于等于10G啊,但是它没有准间续轴,那或者什么呀,或者咱们这个最大位针大小大于等于1G,然后呢,并且我还存在这么一个准确驱重,那这个时候啊,咱们这个第三档就是把这个内存设置为十个G。那接下来看下第四档是吧,如果说咱们这个最大为量大小大于等于01G,但是我没有那个直线驱虫啊或者什么呀,或者咱们这个有这个直线驱虫,就是我不管多大是吧,你小于的小于1G,但是呢,你有这么一个准确驱重,有这么有这么一个countt distinct这么一个多项值,那这个时候我们这个第四个单位啊,咱们这个Spark就把咱们咱们这个kding,就把咱们这个Spark的一个E智内存设置为四个G。
08:12
啊,那如果这四个档位你都匹配不上,那就说明什么意思,也就是说你的那个文件又小,然后呢,他们又没有那个准确去重,那咱们这个K点就会把这个Spark执行内存设置为一个G啊大家把这五个档位好好了解一下,就咱们这个K点啊,是根据你这个Q部它的一个情况,资源情况,我自动设置咱们这个ecuor的一个执行内存,好吧,那这个内存看明白了,那咱们接下来再来看一下啊,咱们这个eor它的一个核心数啊,它的一个执行核心数。啊,咱们这个核心数啊,只有两个单位是吧,如果说你那个单个Q补是吧,Q补里边这个最大文件大小它大于等于零一个G,那或者你有这个准确系重,那我就把你这个核心数设置为五,就是我们这个exe用五个核心去做计算。那否则呢,我就设置成一啊,这个核心数比较简单啊,那简单了解一下,那咱们这个核心数和咱们这个内存都看明白了,那咱们接下来就是什么呀?就是咱们这个堆外内存,就是咱们这个E啊,它的一个执行的一个堆外内存,那我们一起来看一下好吧。
09:13
注意啊,咱们这个堆外内存这五个档位跟咱们这个内存的五个档位是一样的,它们是进行匹配的,那我们看一下啊,第一档也是这个文量大小大于等于100G啊,并且我我存在了这么一个准确度量值,那这个时候啊,我的这个堆外内存就是六个G,那所以说啊,在这种情况下,咱们这个exor它的一个堆内是20G,堆外是6G,那咱们它它能够用的最大内存就是26G啊,因为咱们这五个大位都匹配的嘛,是吧,那咱们接下来再看下下一个的就是如果说你的5G大小大于等于100G啊,或者大于等于10G,但是出出现了这个准确度量啊,准确度量值去重度量值,那我就是四个G,那在这个档位下啊,咱们的每个吸口是多大呢?应该是咱们上边的这个16加上下边这个四,哎,它应该是20G,就是堆内加堆外啊,一共20G,那第第三个档呢,第三个档就是咱们的这个二个G啊,那咱们上面这个堆内是多少呢?是10G,而我这个堆外是两个G,也就是也就是说在咱们这个第三个档位下啊,那咱们这个每S最大能用12G。
10:14
那最后就是第四个档是吧,那是它是一个G,那咱们上面这个是多少啊,咱们上面这个是是是四个G,也就是说咱们这第四个档位啊,我每个Q能用五个内存,就我堆外堆内四个G啊,堆外一个G,它一共能用五个G好吧,那如果说这四个档位你都匹配不上是吧?那最后一个是吧,咱们兜抵的就是咱们那个,呃,对外内存啊,它会512兆,就是你这个是吧,文件大小小于了一个G。并且你还没有这个准确去重这么个多项值,那我们这个堆外就给它512兆这半个G,也就是说啊,到咱们这个最小的个档位,它是多多少啊,是1.5个G,就是堆内是一个G啊,咱们的堆外是五五百一十二兆就半个G啊,1.5个G好吧?啊,那咱们的这个堆外内存减完之后呢,那再往下看啊,咱们这个每个exor它还有个什么呀,它还有一个值就是实例数量,就是我这个QB啊,将来在构建的时候,我这个SPA程序,我我会起几个来运行,那咱们这个ex这个数量我们一起来看一下好吧,首先啊,在咱们这个数量这一块啊,它有个算法,那咱们接下来啊,我就简单讲一讲这个算法是咋回事啊。
11:21
首先在咱们这个kidding的配置文件里边有这么一个设置啊,叫叫kidding.engine.base是吧,In这么一个值,它作为咱们一个基本的SQ的数量啊,注意啊,它的默认值是五。啊,注意啊,这个五它只是一个,只是一个参数啊,它并不是最终,最终并不是五个,那我们接下来看一下啊,那我这个还我还要干嘛呀,我还要根据你这个Q波的这个个数来计算咱们所需要的这么一个SQ的个数。啊,首先我在配置文件里边读取这么一个参数,这个参数是个什么参数啊,是一个因子参数啊,注意啊,咱们有这么一个参数叫instance是吧?Stay这么一个因子参数,在这个参数里边啊,它默认配的是什么呀?120 530 1400,这是啥意思啊,我看一下啊这这块这块给我解释,当咱们这个q boy的个数为零到100的时候,我这个因数为一啊,一般情况下啊,咱们这个q boy的它的个数也不会超过100,也就是说当你这个q boy的个数是吧,不超100的时候,咱们这个因数为一,那所以说我最终的一个所需的这么一个数量,就是拿拿这个一乘以这个五,它就是五。
12:30
那如果说啊,你这个q boy的个数太大,是100~500,那咱们这个因数就为几啊,就为这个二啊,注意啊,这个二忘写了啊,因数为二是吧?那如果说咱们这个Q的个数为500~1000,因数为三,如果你是1000以上是吧,因数为四。然后呢,用咱们根据q boy的算出来这个因数乘以第一步的这个基本的E数量,咱们这个值就是我E的一个预估总数,注意啊,咱们这个值你就比如说我的因数为一,我的基本数为五,我是不是一乘以五等于五啊,咱们这个五还不是最终的那个值,它只是一个预估数量。
13:12
那咱们接下来还要算啊,就是咱们那个QB这个K点,他想要五个,那你最终能不能得到五个啊,这还不一定呢,那么接下来啊,还有另外一个步骤,步骤啊,就是咱们这个K点啊,还会通过Spark它的一个雅安资源池,我得得到一个什么呀,得到咱们这个Spark应用程序它的一个可用的总核心数。和这个总内存数,然后呢,用咱们这个总核心数和总内存数除以咱们这个K0任务所需要的核心数和内存数,你就比如说我这个雅安的总和计数为100,总内存数为128G。可以吧,啊,这是100个核心,128G,哎,那咱们这个比164好吧,64个核心,64核128G,那咱们的这个K0任务,它所需要的一个核心数和内存数,它可能有有有有有个值吧,就比如说啊,我这个K0任务它所需要需要什么呀,需要四个核,然后呢,需要16G内存。
14:07
然后呢,我得拿这个64除以四。啊,和这个128除以这个十六两者之间,我求一个最小值,好吧,我们算一下啊,64除以四多少啊,一四得四是吧,二十四四。咱们应该是四六二十四是吧,所以说它就是16啊,就咱们这个如果按内存来算啊,就是16。而按按这个核心数算就是16,按这个内存呢,用128除以16 128除以这个16啊,它应该是八吧,是吧,啊六八四十八是吧,它是八,那所以说啊,咱们最终这个最小值就是八啊,也就是说啊,我这个雅安它能够就是它能够满足咱们起八个一次空条,而咱们这个呃,Kin它总需要五个,那咱们这个五跟这个八在干嘛呀,再取一个最小值,最终我们的这个值就是咱们这个exeor它最终的一个数量。是吧,如果说啊,也就是什么意思啊,咱们这个安能够满足我们这个需求,就按咱们这个需求来,那如果说咱们这个雅安算完之后呢,它一共能起四个,而你需要五个,那对不起,我满足不了你,我只能给你起四个啊,所以说大家简单了解一下好吧,咱们那个ex它的一个启动一个数量,大家需要按照这么一个算法,我们算一下,这是咱们K它底层源码实现这么一个算法,OK,那咱们那个S数量也搞定了,那咱们接下来再往看啊,还有什么呀,还有一个杀否伏击数量。
15:28
啊,咱们这个呃,K点的一个构建任务,在进行杀烤的时候,它有一个分居数的一个限制啊,那我这个分居数取多少呢。我用咱们那个最大文件大小一个照币啊,这以这个单位为兆为单位,除以谁啊,除以32,然后呢,用咱们这个值跟咱们这个二取一个最大值,也就是说啊,咱们这个沙普分区是吧,最小最小也是二,如果说咱们这个文件比较大啊,除以32,它那个值大于二了,那咱们就按照咱们这个最大文件去算。啊,所以说咱们这个分析数量啊,是这么计算出来的,好吧,在应用上述所有分配规则以后呢,我就可以在K0.logo里边是吧,找到一些日志信息,也就是说咱们最后这个图啊,是在咱们这个官方案例里边给大家截了个图,就大家在这个日志里边明显能看到咱们这个kding是可以自动帮咱们设置这些参数的对比,第一个是吧,E内存四个GES核心是五个,然后呢,E对外内存是一个G是吧?然后呢,E这个数量是五,然后呢,E这么一个啊不是是那个s Spark沙uffle那个分居数是二啊所以说啊,这个东西是咱们那个K点帮咱们自动设置的啊,那这是第一步啊,那第二步呢,如果说咱们这个K点自动设置,你发现啊,它的一个自动设置,设置的不够完美,咱们也可以手动去改,就你可以根据你的这个实际情况,手动设置咱们这个SPA参数。
16:50
那咱们那个手动应该怎么设置呢。大家一起来看一下啊,如果说KLY自动调整的这么一个配置,它在这个运行过程中仍然出现了这么一个Q补构件性能问题,你可以适当更改一下这些配置的值,就比如说啊,他在这给你说这种情况啊,就是就是给大家提供一些思路啊,你可以按照这个思路去调,好吧,那我们真正真真真的我就不调了,就给他提供一个思路,那那么接下来什么思路啊,如果说啊,你在那个Spark的UI界面,你观察到咱们某些任务存在一个严重的机C,就是那个一直在这个垃圾回收啊,就在回收这个内存。
17:27
啊,或者是你发现了大量的eor都丢失或者错失败了,那这个时候啊,就说明一个问题,什么问题啊,咱们这个eor它内存不够啊,你这个E单个它的个运行运行内存它不够,你就可以调大咱们这个ex堆内存和咱们这个它这个对外内存。那一般我们怎么调啊,就把咱们这个值给它调整为两倍,你不要一下调太大,就比如说啊,它本身四个G运行,它运行不了,你一下给40个G太浪费了,你得给它扩充两倍去调啊,刚开始四个G不行是吧,我给八个G,八个G再不行是吧,我给16个G啊,一直到行为止,也就是说咱们给它两倍两倍的增加啊,这样一来我们可以适当调整,避免浪费咱们一个资源,好吧,在增加每个eeor内存以后呢,如果说发现你这个机群还是跑不动,它还有这么一个严重的内存问题。
18:17
你还可以干嘛呀,你还可以把咱们那个Spark的核心数调为一,把这个东西啊,调为一以后呢,那那其实我的意思是什么呀,就是保证我每个ex,我每次只执行一个任务是吧,就单个任务是我这每一个excu一个独家任务,那这个时候啊,那如果说再失败,那就没办法了啊,一般情况下啊,如果你把所有的内存都给他一个任务,让他一个个跑啊,它降低了这个并发量,并行度,但是呢,咱们这个效率比较低,但是呢,它可以通过这种方式来避免咱们这个构建失败,就是我可以适当调整这个参数是吧,我慢虽然慢了点,但是由于咱们这个资源太少,我也可以让你慢慢跑,让你跑完就可以了,好吧,啊,就这么一个逻辑啊。大家可以简单根据咱们那个实际情况来调整这两个参数啊,如果说你们在公司的这个生产环境里边是吧,你的这个文件大就是你这个文件大,哎,而你的这个资源少,你可以按照咱们给的思路你去调好吧,咱们这个文件大啊,资源少,你可以适当先把它调大,如果都给了还不行,那我就把这个核心数调为一,也就是说我让我这每一个eor一个一个的去跑,如果这个任务一个一个的跑,能跑完,那咱们就稍微慢一点啊,无所谓好吧,只要能跑完就可以啊,那如果说啊,这是第一种情况,那那么第二种情况呢。
19:32
如果说你从咱们这个死BUI里边,你观察到有咱们这个大量的任务需要跑多轮,就他一次跑不完是吧,跑完一轮跑一轮,跑完一轮跑一轮,我每轮都把这个所有的内核都用完了,那就说明咱们这个内核数给小了,你可以更改,第一个更改咱们这个Spark一个内核数,第二个就是每个一克一内核数,第二个就是更改咱们这个它这个数量啊,咱们这个数量乘以咱们内核数,就是咱们这个Spark的并行度,就说白了啊,你发现。
20:03
咱们这个死Spark能跑完,就是它跑的比较慢,为啥比较慢,因为你的病都给低了啊,就咱们的资源,在咱们的资源足够充沛的情况下,你可以适当调大咱们这个4SPARK的一个并行度啊,这个第二个啊,是这么一种情况好吧。那第三种啊,如果说你发现啊,一有一些or它一直丢失,或者报这个数据错误啊,并且仅仅是因为在咱们这个杀否期间,它的一个减速器数量太小,或者是是吧,咱们的一个数据倾斜了。那你可以适当的把咱们这个分区数调大,你就比如说啊,一共给了两个分区,那咱们两个分区是吧,我有111个分区100万,另外一个分区只有十个,那你合并下数据倾斜啊,那我为了避免这个倾斜是吧,我就可以给它把这两个分区调成100个分区,或者调成200个分区,那咱们那当咱们这个分区数变多的情况下,它的一个分区规则也会变,那这样一来就能避免咱们分区分区的一个倾斜问题啊,数据倾斜问题,好吧,那所以说啊,在咱们这个Spark调优这一块,大家需要好好了解了了了解将来是吧,在公司里边我们设置合适的SPA参数,就能够提升咱们这个K的任务,它的一个构建速度。
21:13
OK啊。
我来说两句