CoarseGrainedExecutorBackend
启动 CoarseGrainedExecutorBackend
我们知道Executor负责计算任务,即执行task,而Executor对象的创建及维护是由CoarseGrainedExecutorBackend负责的,CoarseGrainedExecutorBackend在spark运行期是一个单独的进程,在Worker节点可以通过Java的jps命令查看,如下
如何启动上图中的CoarseGrainedExecutorBackend进程是我们后面介绍的重点,先看下其定义及UML
从上图可以得到如下信息
- CoarseGrainedExecutorBackend是RpcEndpoint的子类,能够和Driver进行RPC通信,其生命周期方法onStart一定要关注,看执行了哪些动作。
- CoarseGrainedExecutorBackend维护了两个属性executor和driver,executor负责运行task,driver负责和Driver通信。
- ExecutorBackend有抽象方法statusUpdate,负责将Executor的计算结果返回给Driver。
最后,CoarseGrainedExecutorBackend是spark运行期的一个进程,Executor运行在该进程内。
启动CoarseGrainedExecutorBackend
启动流程,大致如下
注册Executor到Driver
注册这步会调用CoarseGrainedExecutorBackend的onStart方法
onStart方法中给Driver发送RegisterExecutor消息,查看Driver对该消息的处理(Driver中和Executor通信的是SchedulerBackend 的子类实现:CoarseGrainedSchedulerBackend)
Driver中先修改Executor信息有关的集合和变量,即注册Executor到Driver,Driver使用executorDataMap集合保存Executor信息。然后返回消息RegisteredExecutor给CoarseGrainedExecutorBackend。
创建Executor
查看CoarseGrainedExecutorBackend中对RegisteredExecutor消息的处理
如上,CoarseGrainedExecutorBackend创建了Executor对象,创建完毕的Executord对象此后用于执行Driver发送的task。
看下 CoarseGrainedExecutorBackend中创建Executor的流程图:
Executor
Executor运行在Worker节点,主要负责执行task和cache数据。
源码及UML如下
介绍TaskRunner和Executor的主要结构
-
TaskRunner: 运行期Executor收到Driver发送的task信息,将其封装为TaskRunner,如下图,同时,TaskRunner继承Runnable,Executor使用线程池threadpool调度TaskRunner。
image
-
Executor: 有两个重要属性,runningTasks和threadPool,分别用于维护正在运行的TaskRunner和调度TaskRunner线程。将收到的task信息封装为TaskRunner及执行TaskRunner发生在Executor的launchTask方法中。
网友评论