00:00
接下来我们来具体的聊一聊一个内存的设置啊,因为你不可能所有的作业都是一样的内存配置也,而且呢,不同的集群性能也不一样,对吧,内存资源也不一样大那。其实最核心的就是怎么来估算一个ex的内存给多大合适啊,那咱们来先首先呢,先了解一下咱们的内存模型,那咱们这个是不是一个统一内存模型啊,对吧?那如果你是1.6之前,那就是一个静态的啊,那个应该是比较少了,那我们了解这个动态的这个内存模型,那首先。这是堆内内存啊,堆内内存首先有一个系统的预留内存。这个默认就300兆对吧,那我们有一个叫统一内存,一个是其他内存。其他内存呢啊,其实就是咱们主要是一些原数据啊,这里主要是一些原数据,还有咱们代码自己自定义的一些数据结构,比如说你定义一个map这种啊。
01:05
这个存在这里,那这个的比例默认就是。这一大块可用内存的40%,40%,那另外一块最重要的就是上面这里了。诶诶稍等啊,最重要就这这块我们是统一内存。或者叫呃可用内存,那么这一块呢,默认比率啊,在这一块里面的存储内存占到一半,执行内存呃占到一半,你看注意看这个参数啊,可用内存指的是外面这个大括号整体的。那上面这个红色方框框是占60%啊啊,所以你要这么看啊,这是乘以60%是得到上面这个蓝色的框框。那在接下来存储跟执行分别占了50%啊,这就是具体的嘛,那我们还要了解每一块的内存到底是用来干嘛的,对吧,你不知道它干嘛,你怎么调呢。
02:04
那首先是最上面这个执行内存,它主要很简单,咱们是不是经常做一些缓存呢?比如说你调用了一个catch,或调用了一个persist对吧,这种这种就是咱们缓存的数据啊。那它使用的就是这一块内存,还有一块咱们是不是可以用广播变量。对吧,那广播变量它也是使用的这一块内存。那下面是一个执行内存啊,执行内存,执行内存呢。主要是就是用来任务执行过程中需要的内存开销。那么再具体一点,沙否。咱们杀uffle是不是需要占用,呃,需要占用一个内存资源,那比如说咱们做了一个join呢,Group by啊。呃,然后,呃。Reduce by key啊等等,这种会产生shuffle的,那么它需要的执行内存就是这一块,叫执行内存。
03:04
那你要根据你作业的不同逻辑啊,去设定不同的去考虑这个内存量啊,这个是咱们一个前置的一个知识,咱们先做一个了解,那在接下来咱们要做的就是估算一下每一块内存需要多大。对吧。你要了解清楚他的需求在哪里啊,就像呢,有时候你一个一个呃,一个人追一个男生,追一个女生,是不是经常就是动不动就去送吃的呀,送花呀啥的对吧?那比如说你给她买了一车苹果啊,你把自己感动的不行,问他为什么不感动啊,人家实际想要吃的是香蕉对吧?啊,你拉一车苹果他毫无感觉啊,咱们要抓住这个需求来,我们来估算一下,首先。Other,这个就是。呃。原数据还有这个自定义的数据结构,那你就看看你你自个儿写的,你肯定知道嘛啊,另外这数据量的多少,你应该是心中有数的,因为毕竟是呃,自个儿产生的数据啊。
04:10
那么这个数据你还需要乘以一个每个execuor的合数,因为它在一个exeor里面,它每一个是不是都要啊,这个结构它要用到嘛,对吧,这个正常来讲不会太大啊,正常来讲不会太大。那如果你嫌麻烦,也可以不理他,因为上面两个更重要一点。那首先一个来存储内存。咱们就首先广播变量要算上,哎,大家注意,咱们当前说的是一个内部啊,一个ex啊,这是一个背景,呃,那。一个Q是不是都会存一份广播变量啊,如果做了广播的话,对吧,所以你广播变量多大,哎,你要算出来,另外还有咱们的数据缓存catch。咱们缓存,比如说你缓存的数据有100个G。
05:04
那你的集群里面,比如说有十个executor。那每个ex是不是存一点。你不可能说每个ex全量存对吧,它是分开存的,那缓存的数据100个G,整个集群有十个ECU,那每个excu是不是就得有十个G啊,啊,你要通过这么来估算,所以为什么说不能通用呢?你不一定代码里写的catch对吧,不一定做的持久化,不一定做了缓存,所以你要结合具体的作业来分析,你把这两个加起来就是能够得到你最少需要,呃,就是你应该需要的一个存储内存有多大。啊,应该遵循这么一个原则,这样才够精确,那在接下来咱们就该来算这个。Execution。这个是比最重要的嘛,对吧,因为storage存不下还可以落盘,但执行内存不够了,是不是直接就挂了。
06:00
对吧,而且严重会影响咱们任务的执行效率。这个就是一个执行内存,因为我们说最核心是不是要做一些沙啊,对吧,那你想想我。在杀否之前啊,比如说这是杀否过程,前面这里一共有100个G的数据要进行否,那这100个G的数据是不是都得经过这个数据交换呢?数据交换的过程中是不是可以理解为它占用了这么多内存呢?对吧,好,那废话少说,哎。那这个怎么算呢?这个也很简单,给大家总结了一个公式啊,首先咱们要算出来一个什么单单个并行度。单个并行度里面,它会有多大的数据量?咱们是不是有一个并行度的概念?对吧?嗯,假设咱们,嗯,就是咱们18个circle的话,默认沙并行都不是200嘛,啊这个参数大家不知道有没有印象啊,那比如说我的数据集在要杀Le的数据有100个G啊,我还是按这么来算,那我们除以200个并行度,是不是代表着并行度其实就是task数量了。
07:18
对吧,就是task的数量,那是不是每一个要多少啊,是不是500兆。对吧,每一个task要500兆的数据,也就每一个并行度要500兆,那咱们一个比如说有四个和。那同时这个execute最多是不是同时跑四个task,也就是说这个时候需要的内存量是不是应该500兆乘以四啊?是不是等于两个G啊,你这么一估算就知道哦,我的执行内存我怎么也得给你两个G对吧,你才够用吗?这个就是咱们如何来精确计算,而不是仅仅停留于理论说,哎,什么参数是多少都多少就行了,你每个作业都是不一样的,代码写的都不一样,这样呢,基于这种原则和方式方法,咱们就能估算出每一块需要多大的内存,那这个时候你把这些加起来是不是就可以得到一个数了?
08:21
那这就是你的exe设多少是最合适的,对吧,最合适的。是。好了。
我来说两句