在Executor的资源调度已经提到了Worker上怎么分配Executor资源的过程,这里就讲Worker分配到Executor后是怎么运行这些Executor的。
流程
在调用Worker启动Executor之前,Master需要更新内存中Application的信息,包括启动一个Executor的各种信息(这里包括Worker的信息、CPU数量、内存大小等)、已经分配了多少核心数。
被分配的Worker也要更新他所启动的Executor,已经使用的CPU数量、已经使用的内存大小。
Master准备好内存数据变更后,就开始通知Worker启动Executor,向Worker发送的消息包括masterUrl、Application的ID、Executor的ID、Application的描述信息ApplicationDescription、Executor分配获得的内核数、Executor分配获得的内存大小等。
Master同时也给Application Driver发送消息,告知Worker上的executor已经启动,Application Driver收到消息后,打印日志。
Worker收到Master发送过来的启动Executor的命令后,封装了Master传过来的信息,保存在内存中,并启动了一个Executor的进程,这个进程用来Driver与Executor通信。Executor进程启动后,更新已经使用的内核数coresUsed和已经使用的内存大小memoryUsed。
Executor的进程启动后,会向DriverEndpoint请求数据,包括Spark属性信息和密钥,Executor拿到这些数据后,就开始创建自己的RPC服务,用于通信。
Executor准备好后,开始向DriverEndpoint发送注册请求。
DriverEndpoint收到请求后,把Executor的数据保存在内存中,然后再发消息给Executor,告知已经处理好注册信息。Executor知道自己注册成功后,就创建了一个Executor对象。
Executor对象创建后,开始向DriverEndpoint发送心跳。
源码思维导图
master-资源调度
Worker-处理信息
DriverEndpoint消息处理
CoarseGrainedExecutorBackend
CoarseGrainedExecutorBackend消息
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。