00:00
好,接下来我们看一下一个整体优化啊,对作业整体优化,第一个是调节数据,数据本地化的一个等待时长,这个呢,主要是涉及到任务调度的时候,那么调度的时候呢,咱们是不是有1EX对吧,要执行task对吧,那么。在调度的过程中,他会选择跟数据尽量靠近,哎,咱们俗话老说那个什么呢,移动数据不如移动计算,那数据本身就摆在那里了,可能这这几个数据本身摆在那,那我这个计算逻辑要用到对应的数据,跟他越近越好。那么咱们的级别有这么几种,一种叫进程本地化。呃,就跟数据跟执行计算逻辑是在同一个JVM进程里面还有一个节点本地化。我的呃,计算逻辑,我的数据在同一个节点,也就是在同一个服务器上面啊这种,那还有一个就是机架本地化。呃,在。
01:00
计算逻辑跟咱们的数据在同一个机架上,但可能不在同一个。节点,这个节点就服务器嘛,比如说计算逻辑在这里啊,那他需要的数据可能在另在在另一台服务器上啊,对他。那它这就涉及到什么呢?网络传输了嘛,那甚至呢,一个any any就是非同一个机架,甚至在另一个机架上了,比如说这是三台服务器啊,就三个节点,我的计算逻辑在这里,那我的数据可能在其他机架的节点上啊,那可能就要跨机架传输,然后这种,那当然是越近越好了,那我们怎么来调呢?它有一个等待时长,就我等了多久。啊,如果无法达到这个本地化级别,那我就降级,比如说我默认值是三秒,我先尝试着去进程本地化里去拉,那发现三秒了不行,那我就降级,我就退而求其次,那就降到一个节点本地化,那比如说再过了三秒又不行,那我就降到价本地化。
02:02
再过三秒又不行,那就是不同一个机架啊去拉啊,是这么一个回事,那我们想要效率高了,那肯定是这个时间等待时间稍微拉长一点就行了嘛,对吧,但是呢,这里也得考虑什么呢?你等待的时间加长呢,那么你会不会影响你整体作业的执行时长呢?也就是说会不会得不偿失呢?所以咱们没有必要完美去追求进程本地化。那一般来讲节点本地话就足够咱们去使用了,对吧,本地话已经已经已经算可以了,那如果是呢,或者是或者是其他的,那么建议呢,大家把这个等待时长调大一点,那我们怎么知道什么时候要来调整呢?第一个呢,咱们可以从沃UI去看,沃UI能够看到执行的task,它的本地化级别,咱们一会来看一下,另外一个呢,咱们如果是用client模式,客户端模式。
03:01
那在日志里面是会显示它的一个本地化级别的。啊,这两种方式都适合咱们去定位啊,那本地化级别有这么几个参数啊,第一个是全局的,也就是说每一次降级过程中的一个时长。啊,默认是三秒,那下面三个是对具体每一个级别的等待时长分别进行设置,默认呢,它们的值就等于全局设置啊,他们默认只等全局设置,当然我们可以对每一个级别单独设置,也就是说比如说process我设的60秒,那么我就是在等待进程本地化的时候等待多长时间,比如说他就等60秒,好,60秒满足不了,那降级成节点本地化,那在节点本地化过程我们设了30,那这边只会等30秒。过了30秒又满足不了,那我只能说啊,去同一个机架找了,那看你设了多少20秒对吧,那就等20秒是这样的,如果不单独设置,就等于全局设置。
04:03
啊是这么一个意思,那这么几个参数呢,默认呢,给大家设置成这样会相对好一点,没必要太长,完全没必要啊。也可以看一下官网,呃,在官网呢,在这个调度模的一参数里面,你看这就是全局设置三秒,那其他的像节点等待,进程等待,机架等待,你看他们的默认值都是参考这个值。当然支持什么自定义,自定义自定义啊,也就咱们的使用方式,那么前面呢,王以在咱们的代码里面,这个local waiting在这呢。咱们在这测试或者提交参数去指定也行啊,那我前面它默认都是带一个S啊。那关于这个参数要给大家说明一下啊,像这种我写6S跟写个一有什么区别,那就要看这个参数它的默认单位是什么。默认,比如说它默认单位是毫秒,那如果我传的值只是数字的话,那么就按默认单位来,那么如果我们传的像带了一个秒,它会自动处理这个秒转化成毫秒的,这个可以带大家看一下源码啊,Ctrl c ctrl shift加F搜一下。
05:19
咱们找源码。哎,这个地方这参数啊,它的默认单位其实是毫秒,但为什么它能设成秒呢?对吧,来我们点一下这个变量。找一下,嗯,我想想在哪找会好一点。Local。看这个create with default,然后呢,这里面有一个com。Converter。这里面再点一下。呃,咱们其实看下面就行了,它这个传输的时候就会将。
06:06
这个东西进行一个转换啊,或者呢,咱们回退看到这个配置项点进来,它有一个类型B,你看这是什么时间,从字符串里获取时间,再点进来,我们大概瞅一眼它的逻辑就行了。再看一下这个。点进来往下它会转对吧,转完之后做一个模式匹配啊,做一个正则匹配,匹配完之后如果不是它下面会抛抛异常对吧?他说时间必须指定,为什么秒毫秒us什么什么什么,不过咱们默认不团单位的话,回退回退默认不传单位,它就是毫秒,那不是毫秒,咱们可以写单位对吧。啊,这个就跟大家说一下,嗯。好,那之前呢,我是已经呢,咱咱们先首先把它全设成一,那就是一毫秒对吧?啊,那基本上他就没时间等了。
07:08
那我们提交执行,看一下他的本地化级别,另外一个咱们打包成这个建议的参数,再去执行一下,那我们来先看看上一次的一个结果啊,上一次的结果。那么这个日志就是刚才执行的,我们随便往上拉一拉,告诉大家在哪看啊,那就是这种日志。启动任务,然后呢,在哪个节点哪个is q,然后呢,这边就是它的级别,你看这边是不是一个机架本地化级别,对吧,因为咱们那个一毫秒他没时间等啊。或者说他等不及,哎等不及re local,那么。咱们废话少说,把那个新的这个把它提交一遍啊。我新的包已经应该已经替换上去了,咱们提交执行看一下啊。
08:00
啊,我确认一下吧,确认一下。时间1839。1839。1852,哦,还没替换,还好,算了,咱们重新打个包呗。按这个60秒30秒20秒的啊。省得折腾。稍等一会儿。好,咱们。接下来就是提交了。然后等他执行完了,我们对比两个参数的一个执行效果,那目前呢,咱们也可以稍微注意一下日志啊,现在咱们是客户端模式提交的。
09:02
这里是能看到。现在还没到。应该还没有啊。啊,这边就有一点了,你看。启动那个task是什么级别的弄的。它是节点本地化的。好,我们等他执行完,一起来对比。好,现在执行完了,我们来看一下,那首先从这个日志上面,我们呢,也可以看到它的一些本地化级别,对吧,启动task,然后结果呢,还是一个机架本地化,那说明这个级别还是不够的。我们也可以看一下历史服务器啊。那这个呢,是咱们一毫秒的,那上面这个是咱们定义的参数几个秒,那我们来看一下,首先是一毫秒。
10:01
点进来,点进来。进来之后,我们发现既有节点本地化,也有计价本地化,那我们这个时候就可以尝试去调整一下。对吧,有低价本地化。回退回退,看一下上面这个,这应该也是一样的。也是有节点有基架啊,有节点有基架在这个地方就可以看了,那我们看一下我们之前参数的一个效果好不好,不好的话咱们还要继续调整。点进来。哦,这边大家可以看到有什么节点本地化,还有机甲本地化,这个是还甚至还有失败的。这失败正常啊,说明呢,这个效果不太好,咱们还得再去调啊,还得去调。那这边这样,我这边全部改成120,我们直接看看效果了,我也不慢慢去调了,因为每个集群它的性能不一样。
11:02
那我这边重新打个包。那我们再执行一下,看看效果有没有好一点。上传替换一下。拉上来,拉过来,替换好。那接下来重新执行一下这个任务。等他跑完这个估计时间要比较久了,那我们稍微等一会儿。是执行的过程,我们可以看到有几个任务已经是什么节点本地化了,节点本地化了,而且你会发现现在日志不动了,这个时候就是在等待降级的一个过程。对吧。你看,现在日志已经完全不动了,光标还在闪。就一直在等,所以呢,从这呢,我们也要考虑一个,我调节的这个等待时长到底好不好,虽然咱们本地化级别能更好,但是呢,说不定咱们任务的总体执行时间会变得更长,所以这个呢,呃是需要去权衡的。
12:11
好,那我们再等一会儿,等他跑完,我们一起接着来看一看。好,我们看到终于执行完了,对吧,跑了好久好久,那这是我们简单扫一眼,你看都是什么节点本地化,节点本地化,那行我们看一下这个历史服务器对比一下三个参数的效果,首先我们看一下这个时间呢,拉长到了12分钟啊,前面都一毫秒的一六分钟调几秒的是七七分钟调120秒。12分,我们瞅一眼。点一下web UI更直观对吧?那我们从这里可以看到全部都是什么节点本地化,还是没法达到进程本地化,那么如果这个时候你再去尝试调大这个时间,我觉得没有什么意义。
13:03
对吧,整个任务时间拉长的太多了啊。那看一下另外一个就。那在这边我们也很。看到很明显啊,都是no的local啊,都是no的local。啊。再来看外面这仨。这是整体一毫秒啊,整体一毫秒,这个是整体,呃,几秒吧啊,十来秒,20秒30秒都有啊,我们分开设置,那最后一个呢,全部直接干上了120秒两分钟,那么可以看到时间足足达到了12分,所以其其实你觉得有没有必要你想想呃,比如说这是一个机架呀,是咱们的多个节点啊,每个节点都是一个服务器,对吧,那每个里面都会有咱们的E。每个节点都有exe。那即使即咱们是跨机架,同学们数据,比如说数据从这拉过来。
14:05
它消耗的是浪费的是网络传输的一个时间。你要衡量一下,如果你等待的时间已经远远大于这个网络传输的时间,那咱们就时间就没必要再往上调了,没必要再往上调,那你想想什么时候才能达到进程本地化,比如说这是一个executor,它比如说有三个线程,也就三个虚拟和we call,那已经在跑了。对吧,这些已经在执行了,我们看一个就行了,现在不用看啊,已经在执行,那现在还有未执行的task克,那他到底该去哪里呢?他需要的数据就在这个eor上,如果这个task能够调度到这里,那就能实现一个进程本地化,那么如果这个时候有其他的exeor。其他的Q,但是呢,大家处于同一个节点。
15:00
那空他他有空闲的位置,那你为何不先过来跑呢,是吧。所以这个咱们是需要去衡量的,当然你发看一下我们的代码,我们的代码是啥呢?读取文件,这个是HDFS上的文件。那么然后呢,咱们做了一个catch,然后用for each来触发这个作业。这么一回事,那我们还想说明的一点,就是咱们看看咱们前面执行过的其他任务啊,比如说这些白pass呢,这些是不是都是思考语法,思考用法,我们随便点一个,当时呢,咱们也没有去调整一个等待时间,也就是默认值都是三秒,我们瞅眼他们的级别是啥。都是no的logo。来,再随便点一个node local。好,回退,我们再找其他作业随便往前点一个。随便点啊。啊,这个不太好是吧,像这种呃,你可以尝试去优化。
16:03
那你看大部分还是都是弄的local,也就是说其实Spark circle来操作的话,整体来讲效率还是比较高的,但是如果是这种读取文件转RDD啊,呃,读取文件慢慢去读的话,效率还是会慢一点啊行,这就是咱们的演示了,咱们也不去慢慢调了再调,我觉得得不偿失的,你先调,调到这么高也没必要,那我还是把这边改成咱们的那个建议值啊,比如说这个还是六秒,呃,尽量等60秒让他进城本地对吧,等30秒让它达到天点本地,等20秒,那就机价本地。行,那这个咱们就解释到这儿。
我来说两句