00:00
那剩下的我们来看一下,使用Spark来集成,呃,跟护底进行一个交互,那这个时候我们怎么来进行一些常规的调优,那么下面这些是官方给到我们的一个建议啊,一些可以调整的事项,那我们挨个来看一下,第一个呢是可以调整并行度,那我们知道Spark是不是可以调整并行度啊呃,如果熟悉Spark应该知道它有个参数,呃,比如说有一个什么什么shuffle啊,然后。并行度对吧,那Spark circle也有个模块,什么spark.circle.s然后点并行度啊,有这么几个参数可以设置对不对。那么我们在使用护理的时候,呃,我们可以对输入啊,就数据的输入进行分区,那它默认并行度是一千五啊,是比呃给到了一千五啊,那这样的话可以确保每个Spark分区都在两个G以内。
01:00
每一个分区。为什么呢?因为我们的并行度就等于什么,大家还记得吧,Spark的并行度,呃,并行度就等于task数啊,也就等于分区数,这个概念大家应该还记得是不是啊,Task的数量啊,就等越分区数,这就并行度,那通过并发调高点控制在每一个在两个G以内,那这个在。呃,Spark是2.4之后没有这个限制,我们用了3.2的话是无所谓的啊,总而言之,大家知道默认是1500,呃,如果我们输入的数据集更大,是可以再调大呗,对不对?那么沙普的并行度设置为多少合适呢?那么大家可以看到,呃,如果说Spark自身我们经常是怎么调啊,那并行度等于也就task的数量等于二到三倍的总核心数,对吧?这个是单纯的从一个集群内部的执行效率来讲的,从CPU使用率来讲啊,尽量让一半的task在等待就好了啊,也不要搞成1:1,那就浪费啊,这种是考虑性价比跟性能,那现在我们只单纯考虑蝴蝶啊,那它这边的参数是分为啊1233个参数,分别是对insert进行啊设置,Upsett进行设置,Do insert进行设置。
02:31
对吧,看你的插入方式是什么,你就用哪一个参数啊,然后呢,是shuffle paras,那这个参数很显然是我们编译成的那个包提供的参数,这个并不是Spark的官方参数,对不对啊,那我们尽量就是比如说我现在要写入的数据有十个G,那我并行度设置为多少合适呢?啊,这一边建议是什么呢?每一个控制在500兆左右,你看它这是总的输入大小,就十个G呗,十个G除以500兆,那大概就是20,那这个时候我们就可以,比如说咱们是upset对吧,我可以调成并行度调成20,这这是官方的一个建议啊,官方的建议啊,当然不绝对啊,那这个参数设置在哪呢?啊,你可以在呃,Submit submit提交的时候,可以去指定一些空啊,这个是允许的。
03:27
刚刚控去指定,那如果你是share这种,或者Spark circle这种交互式的。呃,命令行,那你可以通过什么呢?Set set可以让参数临时生效对吧?把这个参数比如说等于20啊,这样后面再去执行你的插入逻辑就可以了,那么如果是德尔塔是dreamer,还记得咱们有个配置文件叫什么base.properties对吧?那在这个里面是可以去设置一些并行度的啊。九湖底的一些配置项还记得吧?这是de尔塔dreamer啊。
04:03
的时候,我们可以在这指定。好呃,那这是第一个啊,关于变形度啊,那第二一个是关于内存,内存的话有两块,一个是堆外的,一个是堆内的啊,那首先我们知道是B的内存模型。呃,从2.0,呃,应该从2.0以1.6还是2.0以后,它是一个动态占用的对吧,堆内的话啊,那一会再聊这个,那现在聊堆外啊,我们可以开启堆外内存之后呢,我们去设置两个参数嘛。一个是的对外把它用起来,一个是把driver的对外用起来啊。因为我们写入帕的文件的时候,也会用到一定的对外内存啊,所以这两个最好是相应的去设,那设多少合适呢?在你确定的E正常是按照二八原则啊,你整个eecor的,呃,如果是基于雅恩的话,我举个例子,你的容器给到了八个g execor想要用到八个G可以啊,十个G吧,十个G好算啊,十个G,那这个时候建议就是说,比如说你可以把两个G分配给这个。
05:15
两个G分配给这个对外八个G给堆内啊,这是通用的一个经验是不是啊,咱们只是给个建议,那具体呢,还要具体去调不绝对啊,另外一个就比较重要的Spark内存,这个也是非常常规的啊,那其实这一些除了第一个之外,这些在Spark调优里都特别常见,Spark内存它内部是不是分为呃存储内存,呃执行内存,还有一个R啊,其他内存还有一个固定开销300兆还记不记得这个事儿啊,那存储跟运行是占用60%,就是扣掉300之后的60%。再加上other other占用他们的40%,那这两这这几个加起来百分百吧,这个叫统一内存,这个是新的那个统一内存模型,那他俩之间可以互相占用,还记不记得?呃,那在这里我也不想详细展开了,呃,我们你可以去B站或者上硅谷教育公众号啊,我们也曾经发布过那个Spark调优的课程啊,那个应该也是我讲解的啊,那我们看一下,呃,就这个地方啊,Spark优化啊,我直接看一下文档,让你瞅一眼留个印象啊,那里面关于这些都有详细的考虑,看这个内存模型,这个是堆内的啊,你看这个就是说一个系统保留啊,固定开销啊,300兆,那扣掉这300兆剩下的就称之为统一内存。
06:47
统一内存的60%是给到他们两个40%给到他啊,Storage就是存储一些你缓存数据啊这些啊。就RD的那些啊,你要缓存什么的,那excution,比如说你执行的一个shuffle啊,中间这些运行内存,运行的时候要用到的内存,它俩之间可以动态占用是吧?啊。
07:10
那这个R就是咱们自定义的一些数据结构啊,比如说你定义一个变量啊。啊,是用什么结构来存储啊这种啊,还有一些内部的原数据啊,不是RDD的原数据啊。啊。那我们看一下官方的建议,它是什么呢。但是什么需要将单个文件读入内存,也就是说他要将数据先加读进来,读进来之后是先到内存里面对吧?这样呢,进内存之后才能进行compassion啊,或者classing,对吧?那因此我们要关注的是它读进来的数据占用的是哪一块空间呢?来来大家看,那么肯定是这一块嘛,存储空间嘛,用于缓存数据嘛,你读进来的这些数据肯定用的是这个storage,所以这个时候我们可以把它怎么样调大啊,如果你读的这个文件比较大,你可以去调大一点啊,那参数呢,就是它用来调啊,Storage看到没有啊。
08:13
呃,那再往下呢,调整文件大小,设置limit size。可以限制我们的文件大小啊,这就是呃,提醒我们啊,可以去设置这个东西。那还有呢,对时间序列和日志数据,比如说大一条数据啊,它比较大,不管是数据库的还是说一些日志啊,我们可以去调整一下。在这个场景,我们可以去调整布隆过滤器的一个精度啊。呃,这边指的大家应该知道是啥吧?指的是索引嘛,我们其中索引的默认类型不就是布隆过滤器吗?那调整精度不是有几个参数决定的吗?
09:00
那可以通过调用这几个啊去调整啊。或者我们开启一个动态,还记得吧,我们也可以开启一个动态的功能啊。呃,还有一个就GC啊,那个这个在常规,这属于Spark的一个常规优化了啊,那一般我们大数据这些计算框架,我们都建议用g one或者用CMS啊,这种GC,呃,效率会好一点啊,那指定的时候就是Spark的这个参数是指定一个一些JVM参数的啊,就可以指定GC啊,那你看。啊,比如说又是。这个GC对吧。恩,这些都可以去指定啊。这个我也不用多聊了,那如果发生了OM。当然我们要区分的官方并没有明确说是哪一个地方OM,我们知道一个JVM的堆内存当中啊。
10:04
或者说咱们是不是也呃是站一出啊,是不是有站也有堆啊,你得看是站OM还是堆OM对吧,那如果是堆OM呃,那我们可能。就要具体去看了,那如那这个地方呢,他给我们建议是什么,将从呃。整个内存这些都调小,这是调小为什么?允许其溢出,而不是OM,相对于速度变慢,跟它过一段就挂掉了相比,你哪个更好?那肯定是速度慢点,但稳定的好。那我们看一下这个参数是什么意思啊,Memory这个因子0.2 storage0.2,看一下这个文档,那其实就是这个地方,它默认是0.6,也就是他俩合起来。啊,它俩合起来默认是呃,零统一内存的0.6,那storage占0.6的一半啊,也就0.3啊,那这个也是0.3,这是默认的啊,那他建议是我们把这个统一内存调成0.2,然后存储内存也是0.2,说白了就是把整个内存都给到他去用了,也就是说把它都调小了,统一内存调小,那这个地方是不是就变大了。
11:24
对吧。那把这一块预留出来。好了,那下面官方也给了一个完整的示例啊,大家可以做一个参考啊,那这些配置文件就是放在你可以配置下,可以放在那个Spark的,呃,一个default。对吧。这么一个配置文件里面,我找一找吧。这里是不是有一个default对吧,它是temporary模板文件,你把后缀去掉,然后把配置项写进去就可以了啊,然后再重启你的Spark。
12:07
这就OK了。
我来说两句