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方法交给WorkflowExecuteThreadPoolclass WorkflowExecuteThreadPool extends ThreadPoolTaskExecutor是一个线程池,执行传入的方法。WorkflowExecuteRunnable::call:根据 ProcessInstance 构造 DAG,即产出多个关联的 TaskInstance,提交到TaskPriorityQueueclass 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意识并且利用自己的专注力-读《为什么精英都是时间控》