spark的调度包括资源调度和任务调度两种。前面介绍过spark的任务调度包括DAGScheduler&TaskScheduler,本文主要介绍资源调度,包括资源调度中涉及的各模块以及它们之间的通信。
Spark中物理节点包括三者,分别是client、master&worker,而与资源调度相关的角色有四个,分别是driver、master、worker和executor。这几个节点与角色之间的关系可以从下面这张图中描述:
Driver:用于运行Spark应用程序,其中的SparkContext是spark应用程序的入口。根据spark任务提交方式的不同,Driver可以运行在不同的物理节点上,通过spark shell提交时,driver运行于master节点,通过spark-submit提交时,driver运行于client端。
worker:集群中任何可以运行Spark应用程序的物理节点,对应物理机,运行一个或多个Executor进程;
Executor:内部是一个线程池,交给Executor的Task都运行在其中的一个线程,线程间共享资源。此外,Executor有一个代理类ExecutorBackend用于与TaskScheduler&TaskSetManager等模块保持通信,这部分涉及任务调度,这里不再详述。
这几个角色之间的启动流程如下:
SparkContext.createTaskScheduler->taskScheduler.start()->SchedulerBackend.start()->new AppClient&start
还有一条线:
AppClient.on