Master、Worker是DolphinScheduler最重要的两个模块,Master负责任务的调度,Worker负责任务的执行。
DolphinScheduler 官网的这张图概括了整体的流程:
注:图片基于V1.3.0,跟当前略有出入
1. 线程模型
任务提交过程中,使用到了众多线程,其中最重要的单线程、线程池,如图所示:
DolphinScheduler 的线程模型总的来说:
- 串联了多个生产者-消费者,队列使用内存队列
- 线程定义了独立的名字区分
- Master-Worker 之间通过 Netty 通信
2. Master线程模型
定时调度的处理入口类是class MasterSchedulerBootstrap extends BaseDaemonThread implements AutoCloseable
,这是一个单线程。
findCommands
方法查询出待调度的任务,通过command2ProcessInstance
转化为ProcessInstance
。构造WorkflowExecuteRunnable
,作为生产者传入WorkflowEventQueue
。class WorkflowEventLooper extends BaseDaemonThread
消费WorkflowEventQueue
,调用WorkflowStartEventHandler.handleWorkflowEvent
,将WorkflowExecuteRunnable::call
方法交给WorkflowExecuteThreadPool
class WorkflowExecuteThreadPool extends ThreadPoolTaskExecutor
是一个线程池,执行传入的方法。WorkflowExecuteRunnable::call
:根据 ProcessInstance 构造 DAG,即产出多个关联的 TaskInstance,提交到TaskPriorityQueue
class TaskPriorityQueueConsumer extends BaseDaemonThread
单线程消费上述队列,调用dispatchTask
方法,通过consumerThreadPoolExecutor
线程池将任务发送到各个Worker节点
3. Worker线程模型
- Worker接收Master请求的处理类是
class TaskDispatchProcessor implements NettyRequestProcessor
,处理方法process(Channel channel, Command command)
。构造WorkerDelayTaskExecuteRunnable
,写入到DelayQueue<WorkerDelayTaskExecuteRunnable>
class WorkerManagerThread implements Runnable
内部启动一个线程,消费上述队列,将任务提交到线程池class WorkerExecService
维护一个线程池,执行WorkerTaskExecuteRunnable::call
方法,该方法会根据具体Task类型执行对应任务:ShellTask/SqlTask/FlinkTask等。
PREVIOUS意识并且利用自己的专注力-读《为什么精英都是时间控》