概要
本篇博客是Spark 任务调度概述详细流程中的第五部分,介绍CoarseGrainedExecutorBackend的启动。
CoarseGrainedExecutorBackend
在介绍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
接着Spark 任务调度之Launch Executor介绍,最后讲到Worker进程收到LaunchExecutor消息,然后,Worker将收到的消息封装为ExecutorRunner对象,调用其start方法,如下
start方法启动线程,调用ExecutorRunner的fetchAndRunExecutor方法,fetchAndRunExecutor方法中将收到的信息拼接为Linux命令,然后使用ProcessBuilder执行Linux命令启动CoarseGrainedExecutorBackend,和启动Driver的方式如出一辙,fetchAndRunExecutor方法如下
ProcessBuilder执行的Linux命令大致如下
上面的java命令会调用CoarseGrainedExecutorBackend的main方法,main方法中处理命令行传入的参数,然后创建RpcEnv,并注册CoarseGrainedExecutorBackend,如下
至此,启动CoarseGrainedExecutorBackend就介绍完了,由于将CoarseGrainedExecutorBackend注册到RpcEnv会调用其onStart方法,所以下一篇就是查看onStart方法中进行了哪些操作。
总结
介绍了CoarseGrainedExecutorBackend的作用及启动流程,大致如下