00:00
任务的切分咱们已经给大家讲完了,接下来呢,我们来讲一下任务的调度啊和所谓任务的调度呢,是因为啊当前的任务准备好了,而我们的ex资源也准备好了,那你怎么能够将任务呢去发送到某一个ex当中去执行呢?对吧?这就属于一种调度了,那么接下来呢,我们把这个调度呢给大家一块儿来看看啊来咱们看一看,呃,回过头来,在我们的这个位置,我现在呢,Task根据我们的阶段,它已经计算出来需要多少个task了,咱们之前也讲过,我们当前作业当中的task其实是所有阶段当中最后一个R啊,就是所有阶段中每个阶段最后一个RDD那个分区数量之和吧,对不对?那好,那我现在呢,任务已经有了,咱们接着往下,往下,如果任务不为空,那怎么办?它会通过一个叫task schedule,就是任务的调度器来提交这个task是这样的啊,但是。
01:00
呢,它会把咱们的task呢做一个包装,同学们会发现它要做一个包装,变成一个叫任务急,所以啊,咱们在这里呢,需要给大家稍微的画一画了啊来,咱们就拿这个紫色的吧,来放过来啊,嗯。放过来,呃,放过来以后,咱们这里写上叫task set,然后往这边来放啊,放过来然后呢,我们叫task set,那你task set里面是什么呀,那里面就是一个一个的我们的task呀,所以把这个呢,我们拿过来啊,咱们写上咱们叫task,诶就是这样好把它放过来,咱们颜色呢,给它一个蓝色会不会好看一些呢?咱们黄色吧,嗯,黄色啊,然后来我们的task OK,咱们假设现在就有三个task,是不是就可以了呢?同学们,这个叫做task set啊,就是我们的task set就是它了,嗯。好了,然后呢,这个呢,我们说到这里啊,就是它好,我们再往下,往下以后,那我们现在就提交了呀,所以点一下,点完以后你会发现它是一个抽象的方法,但是我们在运行过程当中,怎么可能运行一个抽象的,不可能它一定是一个具体的方法,对吗?所以拷贝,拷贝以后打开,打开以后来点过去,那么大家会发现就在这个位置,咱们叫submit,咱们的tasks啊,就是它了,他把一个task set给他放了过来,放了过来以后,别的咱们先不考虑,大家看我们的这个地方,它会有个叫create task manager,把这个task给它放进去了,所以我们点一下点点完以后你会发现它封装了一个manager叫管理,叫任务级的管理器。
02:44
那么然后把我们的task set给它又传进去了,说的简单点呢,就是因又他又把这个task干嘛呢,又给它包装了一下,所以呢,我们拷贝,诶拷贝放到外面啊,放到外面给它一个我们的呃,绿色吧,放到底层,嗯,好了,放到这个位置,同学们看,那它的这个地方呢,我们就写上了,咱们叫task set叫manager,诶咱们叫manager,所以它又包装了一下啊好,那么回过头来,咱们后退啊,咱们后退,诶好了,后退以后咱们往下呀,这个manager咱们往下往下往下,诶你看它干嘛了,他这边有一个叫scheduleable build,一个叫调度构建器,然后呢,叫的task set manager,就是把这个manager给它放进去,这个是什么东西啊,不知道,所以呢,我们点它一下,看看它是个什么东西,我们点点完以后,你会发现它其实就是一个调度器,它就是一个调度器,这个调度。
03:45
器啊,在我们下面这个地方有负值,咱们搜索一下,往下走,往下走大家会发现它会根据咱们的调度模式来形成不同的调度器,那么这个调度器当中就有两个,一个叫fio,叫first in first out,先进先出。
04:03
有这么一个调度器,还有一个是什么东西呢?是我们这个叫fire,叫公平调度器,所以啊,在咱们SPA当中也有这个公平调度器,先进先出调度区的区别,但是咱们的这个调度模式呀,咱们打开默认情况下,它来自于一个配置文件,它的默认取值呢,应该是我们的fio,记住了,在此bug当中,任务的默认调度呢,是fio啊,就是它。好了,这个事情我们知道了以后,那么我们回去吧,咱们来往下走,往下走,走到刚才的这个地方,大家会发现就往那个调度器里面放,所以我们点开,点开以后它是一个我们的抽象的,所以咱们找一下,咱们有两个调度器,默认是fio,咱们打开,打开以后你会发现它里面会有一个manager,它会把manager干嘛呀,放到一个root to当中这个呀,你可以理解为叫任务。
05:04
铺嘛,咱们叫任务池对不对,所以啊,在咱们的这个位置当中,同学们看啊,我准备呢,要给大家画一个了,哎,干嘛呢,咱们叫做铺,嗯。啊,咱们写上咱们叫task,咱们的就是这个意思啊,然后呢,这个呢,我用红色给它标识一下啊来这个我们往下走,往下走好了,画完了以后啊,同学们,那我就把这个task跟manager呢,我就给它复制过来,放过来啊放过来以后咱们给它缩小一下吧,因为这个池子当中可能不止他一个呀,所以我们来啊,给它稍微缩小一下啊缩小诶缩小就看不到了,是吧,行吧,没关系,因为上面有这个图形啊,看不到看不到吧,所以大家可以看到它里面就会有多个吧,所以咱们可以再画一个,咱们多画几个啊来意思意思嗯。好,咱们再来,诶划过来,所以啊,这个就是我们的什么啊,咱们叫task po一个任务池,诶就行了,所以到了这一步以后啊,咱们等同于把咱们当前的任务放到了一个池子当中,所以啊,我们回过头来,咱们现在就放过去了啊好,那你放过去以后,那你什么时候把它取过来呢?对不对,所以呀,我们回过头来,咱们再回去,回去到这儿以后,它往里面放了不是,然后呢,接着就往下走,往下走不管它,这边就没有了,接着看这什么东西啊,有一个叫恢复啊,他就准备要从池子里面把它取过来,所以在记住啊,这边是放,这边就取啊,那么我们来点一下,点点完以后它是一个我们的抽象的,所以我们找一下咱们拷贝,拷贝以后,这边有一个集群和本地,咱们看集群打开。
06:44
打开以后咱们搜索一下,大家会以发现它里面有一个这个啊,就是它driver and point,有个叫send自己给自己发消息,发消息了,发了一个什么消息啊,就是我们来取数据的一个消息取任务,那我们这里呢,给他搜索一下吧,啊来搜索一下,嗯,咱们这里呢,搜索往下走,往下走啊,诶咱们在这在这个地方,它就等于收到了消息,收到的消息就是它,然后呢,有个叫make office啊office然后呢,我们打开点开之后,那么在下面的这个位置,他就准备干嘛呢?得到咱们任务的描述信息,然后呢,往下走,如果任务不为空怎么办?启动咱们的任务,所以啊,这一块其实就是我们的任务的调度,你前面把任务放在一个池子当中,然后现在再从任务词里面把它取出来,就是这个意思,但是啊,咱们的这个取的过程,在我们的这个地方,它有一个叫做schedule。
07:44
把resource office把这个拿过来,我们点一下,咱们点点过去以后,它在这个地方就完成了我们的操作,其实啊,咱们的这个task呢,一般是均匀的,什么轮巡啊,轮巡到每个我们的节点当中,让我们的每个节点更加均匀一些,是这么回事儿啊,但是细节上会稍微的有一些变化,所以呢,他会根据他的什么优先级呀,包括他的一些什么呢,我们的这个每个节点当中的这个什么轮询呢,它会有这样的操作,但是我说了细节上有变化,有什么样的变化呢?咱们往下走,往下走,往下走啊,他在这个地方,咱们往下走,咱们看看关键性的点啊,往关键性的点,呃,这边有一个我确认一下挨在这呢。
08:28
它会有一个叫ED task set q,这是什么意思呢?咱们点一下,咱们点点完以后在它底层啊,其实对咱们任务池当中的这些我们的manager做了一个什么算法,这个算法呢,就是我们的什么调度算法,咱们点它一下,点点完以后你会发现我们的算法是不一样的,如果你是我们的fio,用的就是这个它算法,如果是fair公平的话,用的就是这个算法,那么这些算法在干什么?其实说白了就是把咱们的那个manager做一个调度,看看谁先执行,谁后执行,只是我们的两种不同的算法,它不一样,这个地方是普通的comp,而这个里面就更加的复杂,会有大量的一些参数,比方说运行的任务数量啊,还有一些我们的什么权重值呀,包括一些比率值呀,它里面都有这个,咱们就了解一下就行了啊,它里面有个公平调度啊,有一个我们的先进先出的调。
09:28
其实啊,里面都有个优先级的概念,OK。后退之后,那么走到这个位置的话,来再后退,那么他就会拿到咱们排过序的什么我们的任务集,拿到排过序的任务集以后干嘛呢?他再往这边去做一个轮询,轮询之后咱们再往下看,下面呢,会把每一个排过序的那个集合呀,他做一些判断,做一些匹配,其中有这么一个概念,什么概念呢?叫做本地化级别,这个我们之前给大家讲过,什么叫本地化级别呀,就是说我当前呀,比方说我们这边有两个我们的对吧,Execor来拷贝,这边呢,我们叫executor对吧?诶,OK,然后呢,这边我们也有两个,然后呢,我这边再来一个我们的driver啊,咱们的driver OK放过来,然后呢,用我们的红色来表示一下,那好了,那我现在的这个位置,我们的箭头,我们的箭头指向它,指向他,然后呢,我们放过来,然后呢,我们的箭头指向他,OK,我放到。
10:32
这里我们都给它指向它啊,好了,那问题来了,你现在如果driver当中有一个task的话,比方说我现在呢,有一个咱们的task啊,咱们放过来,咱们叫task,那你这个task你到底是发给谁呀?对吧,你这个task你是发给我们的,用个蓝色吧,你发给上面这个equ,还是给我们下面这个equ发过去啊,你不知道。你不清楚对不对,那怎么办?它就会涉及到一个首选位置的概念,首选位置的概念是什么意思呢?就是我的task是个计算,我要跟我的数据最好是发在一块儿,那比方说咱们exor,它所在的节点呢,比方说有数据,咱们举个例子啊,比方说他这边有数据。
11:19
好,咱们写上叫data,那是不是意味着我把task你发给他会更好一些,为什么呢?数据在这个节点上,我的计算也在这个节点上,所以这是不是就是最好的,但是你不见得发的过去,你是不可能要发给他,你要发给他的话,就意味着咱们的数据要从这边怎么办拉取过来,对不对,我们要给它拉取过来,诶就是这么个意思,所以呀,这就提到了一个我们经常提到的概念,什么概念呢?就是我们移动,咱们叫做什么呢?叫做移动数据,它不如咱们叫移动计算,这个大家能能不能明白,可以明白吧,对不对,哎,就是这个意思啊,放哪呢?放下面放这儿吧,嗯,用一个红色来表示一下。
12:04
所以啊,我把这个计算呀,我挪到这儿来,这不就叫移动计算吗?如果你要挪到这儿来的话,这个数据不就得移动过来吗?所以它肯定慢嘛,所以移动数据不如移动计算,所以要把计算放到这个位置是一个好的选择,可是那你放在这个地方啊,就涉及到他俩的关系问题了,咱们这个叫做数据,那么这个叫做计算,那么我们数据和计算的位置。咱们就有个级别啊,所以我们在这里也补充一下来,咱们叫计算和咱们的这个数据,他们的一个位置啊,会存在什么呢?不同的级别,所以咱们叫级别。呃,这个级别,这个级别我们称之为称之为什么呢?我们叫本地化级别,哎,本地化级别,那这个本地化级别其实就是他们的位置,那你这个位置有什么级别不级别呀,首先如果他们俩在同一个进程当中,那就说明他们在一块内存当中,我们就称之为叫进程本地化,所以大家看啊,这个级别呢,它会有一个进程本地化,咱们叫进程啊。
13:16
进程本地化,什么叫做进程本地化呢?说的简单点就是我们的数据和我们的计算在同一个进程中,哎,这就叫进程本地化,这个效率肯定是最高的,为什么呢?在同一个进程当中,说白了就是一块内存当中,但是你不一定啊,你有可能你的数据和计算它不在同一个进程当中,但有可能在同一台机上,对不对?所以我们称之为叫节点本地化,同一个机器就是同一个节点呢,所以它在同一个什么呢?我们叫节点中,这个我们称之为叫节点本地化。那好,那如果你不在同一个节点呢,那么还可以在同一个机架上面,咱们叫基价本地化。
14:01
所以啊,咱们叫基价啊,咱们的本地化在同一个我们的基架上面啊,咱们叫基架,基架上那好了,如果你不在同一个机架上面的话,那么就任意了,你想放哪放哪就无所谓了,所以呀,诶这边我们就写上叫任意啊,咱们就写成叫做任意,你想放哪放哪就没有什么关系了,你的位置呀就没有关系了,所以说我们的这个就称之为叫级别,这个是最高级别,为什么呢?效率最快,你将我的计算发给他所在的进程,这个是最快的。那如果发不过去干嘛呢?降低级别发给他的节点,那么在同一台机上也很快,如果还不行,发给他的什么机架也可以,如果还不行,那就随便发就完事了,这个就叫做什么呢?本地化级别,所以在咱们的这个地方,他就会判断它的级别,看看你应该发给哪个地方,你把task给拿到了,那每个task我应该发给谁啊,在咱们当前的位置就可以做关联了啊,就可以做关联了,就是这个意思啊,好了,这个咱们细节上咱们就不再给大家说了啊,咱们接着往下,那往下以后,基本上他后面就把咱们的任就得到了,得到了任务之后,那还说啥呢?那是不是我们后退后退后退后退到咱们的这个地方,我看看啊,咱们往后退,你把任务就得到了,任务得到以后干什么了?要启动任务了吧,所以大家看我们这个图形,图形往前走,往前走,当我们现在我们的这个任务池子里面有任务,把其中的一个取出来。
15:34
开了啊,比方说把它取出来了,取出来了以后干什么呀?你往下看,咱们再去点它点点完了以后把任务取出来,每个任务都拿到,拿到之后你往这儿看,它会判断你当前的这个任务的这个数量啊,就序列化的这个数量有没有超过它的限制,如果要没有超过它的限制的话,会走下面,走下面咱们别的不管它,看关键性的点,这什么意思,这是什么意思,同学们是不是要找到对应的那个ex的终端,然后给他发消息,给他发什么消息叫启动task。
16:12
有没有发现你启动task的时候往下看,是不是要把咱们任务序列化之后给它传过去,所以啊,说的简单点,这行代码就意味着我要把咱们从任务池当中取到的任务数据序列化之后,发给远程的某个来执行,诶,就是这个概念,而这个以就根据我们前面的本地化级别可以选出来,选出来以后一发送不就OK了吗?就是这个意思,好了,这个就是我们的调度的问题,任务怎么往里面放,怎么往外取,对不对,就是这个意思啊。
我来说两句