DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner

2021SC@SDUSC

文章目录

  • 一、具体分析
    • 1.dispatch.host
      • 1.assign
      • 2.HostManagerConfig
      • 3.三种HostManager
    • 2.ExecutorDispatcher
    • 3.processor
      • 1.queue
      • 2.Processors
    • 4.registry
    • 5.runner
    • 6.MasterServer

前文链接:DophinScheduler server部分 核心代码详细解析——DophinScheduler至关重要的角色Master在server在承担了何种功能?

一、具体分析

目录结构参见前文,让我们直接开始分析。

1.dispatch.host

上次我们对dispatch的分析还剩下了内容比较多的host,我们在这里予以补充。
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第1张图片

1.assign

我们先来看host三件套:
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第2张图片

hostSelector用来在分配任务的时候选择主机host,在这里是个枚举类,有三种选择方式:随机、轮转、低重量优先。

DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第3张图片

HostWeight会为每一个主机计算一个权重,从而决定任务的分配顺序。
权重的计算方法是(cpu * CPU_FACTOR + memory * MEMORY_FACTOR + loadAverage * LOAD_AVERAGE_FACTOR)/uptime,
也就是cpucpu因数+内存memorymemory因数+平均加载数*系数的和,再除以host的启动时长

DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第4张图片

hostworker的方法就比较常规,没什么可说的。

在这里插入图片描述

其他的类就是轮转法、随机选择法的实现。具体的实现思路就同其命名一样,没什么特别新颖的地方。这里贴个代码大家看一下就行,我不再赘述了。

轮转法:
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第5张图片

这个方法代码量较多,但主要是不同情况下的差错处理。更多的就不再截出来了,大家看看知道意思就行。

重量轮转法:
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第6张图片
随机选择器:
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第7张图片

2.HostManagerConfig

DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第8张图片

这个方法就用了一个switch语句控制给host分配任务的方式。

3.三种HostManager

在这里插入图片描述

这三个类则是分别负责三种分配方法的具体控制。

2.ExecutorDispatcher

DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第9张图片

这个类中的核心代码便是这个dispatch函数。
开头首先定义了一个executorManager对象,随后选中当前host,若都不为空则尝试调用executorManager中的execute方法进行任务的执行。无论结果如何,函数都将调用executorManager中的afterExecute方法进行收尾处理。

3.processor

DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第10张图片

1.queue

queue文件夹下的三个文件作用分别是提供状态事件回应服务、处理任务回应事件、提供任务回应服务。

2.Processors

分别是HostUpdateResponseProcessor、StateEventProcessor、TaskAckProcessor、TaskKillResponseProcessor和TaskResponseProcessor。
见一叶落而知秋之将至,,掬一杯水而知江河之清。我们挑一个StateEventProcessor来做具体分析,读者知一便能知晓这些类的所有奥秘。
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第11张图片
这个类中最主要的方法便是这个rocess方法。
方法开头先检验参数,值得注意的是用了String.format来规范命令command的类型Type。
接着方法依次创立了StateEventChangeCommand、StateEvent对象,然后调用多个set方法来补充定义StateEvent的属性。
最后,记录日志,然后在stateEventResponseService中添加回复。

4.registry

在这里插入图片描述

这三个类分别负责管理者注册用户、管理者注册数据监听者、服务器节点管理者。
类内部都是一些初始化方法和线程启动方法,没什么好说的。

5.runner

DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第12张图片

同样的,虽然这个目录下有很多类,事实上他们都是彼此进程的启动类,共享着相似的方法。
观察结构可知,task目录下类两两分组,分别是处理进程Processor和处理进程工厂ProcessFactory,工厂负责所有同类的进程的管理和包装。

CommonTaskProcessFactory:
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第13张图片
CommonTaskProcessor(继承自BaseTaskProcessor):
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第14张图片

这是分配任务的函数,而分配任务也正是master的最主要任务。
开头若队列为空,进程则会新建并初始化任务更新队列,然后在完成后写入日志。值得注意的是函数为每个进程按照一定的算法生成了任务优先级,并且这里并没有实际地分配任务。实际上,具体的操作会在各自的Processor里面进行完善并实际执行,而这里作为CommonTaskProcessor只规定所有Processor所共通的内容。

6.MasterServer

最终我们终于来到了MasterServer,Master的总启动类。
DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第15张图片

这便是总启动方法。可以看到这里又密密麻麻的nettyRemotingServer方法,它们的主要功能在于注册进程们,然后正式启动server,之后是masterRegistryClient以及eventExecuteService和masterSchedulerService的初始化和启动,它们的功能跟别是提供自我容错以及启动日程器。

DophinScheduler server部分 核心代码详细解析——master分析续:processor、registry与runner_第16张图片

这里是进行日志的纪录。

对Master的分析到此终于告一段落。

你可能感兴趣的:(mongodb,zookeeper,spark,big,data,大数据)