Spark 通信架构 端点

image.png
1) RpcEndpoint:RPC端点 ,Spark针对于每个节点(Client/Master/Worker)都称之一个Rpc端点 ,且都实现RpcEndpoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则调用Dispatcher

2) RpcEnv:RPC上下文环境,每个Rpc端点运行时依赖的上下文环境称之为RpcEnv

3) Dispatcher:消息分发器,针对于RPC端点需要发送消息或者从远程RPC接收到的消息,分发至对应的指令收件箱/发件箱。如果指令接收方是自己存入收件箱,如果指令接收方为非自身端点,则放入发件箱

4) Inbox:指令消息收件箱,一个本地端点对应一个收件箱,Dispatcher在每次向Inbox存入消息时,都将对应EndpointData加入内部待Receiver Queue中,另外Dispatcher创建时会启动一个单独线程进行轮询Receiver Queue,进行收件箱消息消费

5) OutBox:指令消息发件箱,一个远程端点对应一个发件箱,当消息放入Outbox后,紧接着将消息通过TransportClient发送出去。消息放入发件箱以及发送过程是在同一个线程中进行,这样做的主要原因是远程消息分为RpcOutboxMessage, OneWayOutboxMessage两种消息,而针对于需要应答的消息直接发送且需要得到结果进行处理

6) TransportClient:Netty通信客户端,根据OutBox消息的receiver信息,请求对应远程TransportServer

7) TransportServer:Netty通信服务端,一个RPC端点一个TransportServer,接受远程消息后调用Dispatcher分发消息至对应收发件箱

注意:
TransportClient与TransportServer通信虚线表示两个RpcEnv之间的通信,图示没有单独表达式
一个Outbox一个TransportClient,图示没有单独表达式
一个RpcEnv中存在两个RpcEndpoint,一个代表本身启动的RPC端点,另外一个为 RpcEndpointVerifier

standalone 节点启动

image.png

【重点】submit 应用提交流程

image.png

<1>. 应用提交

对应图中左上角橙色部分

  1. 当submit 提交一个应用,为Client启动一个JVM运行并创建相应的运行环境,包括RpcEnv,Endpoint等,(ClientEndpoint主要用于和master通信)
  2. ClientEndpoint 通过RequestSubmitDriver向master请求提交jar包
  3. MasterEndpoint接收到该消息后,在一个Worker上通过LanchDriver 启动该任务的driver,启动成功后通过SubmitDriverResponse 回复ClientEndpoint提交成功
  4. Client收到该消息后,通过RequestDriverStatus 验证driver状态检查driver是否真正启动成功
  5. 如果验证通过则退出JVM
<2>. 启动Driver进程

左侧第三个图,紫色线

  1. WorkerEndpoint 接收到Master的LauchDriver消息
  2. WorkerEndpoint 创建并启动DriverRunner的封装类
  3. DriverRunner通过run DriverWrapper 在本台机器(就是该Worker)上启动一个新的JVM运行Driver
<3>. 注册Application
  1. Driver中的SparkContext 创建一个SparkEnv(包括Spark集群连接、资源等运行所需要的环境的类)
  2. SparkContext创建DAG Scheduler和TaskScheduler
  3. SparkContext根据运行模式(Local/Standalone/Cluster)创建相应的SchedulerBackend
  4. SchedulerBackend创建一个DriverEndpoint,主要用于发布任务,和Excutor通信
  5. SchedulerBackend创建一个包含了ClientEndpoint的AppClient,ClientEndpoint主要用于和Master 通信
  6. ClientEndpoint通过RegisterApplication消息通知Master要注册一个应用
  7. Master收到该消息后,通过RegisteredApplication回复Driver(ClientEndpoint接收)表示应用已经注册
<4>. 启动Excutor进程

蓝色虚线

  1. Master根据注册应用的信息(资源需求等),挑选一个合适的Worker,通过LauchExcutor消息通知Worker要启动一个Excutor;同时Master还会向Driver发送ExcutorAdded消息,通知Driver正在申请Excutor,但此时Excutor还未成功建立。
  2. 接收到LauchExcutor消息后,Worker创建一个ExcutorRunner并启动,ExuctorRunner 会在一个JVM上运行Excutor并拥有该JVM句柄(控制该JVM)。
  3. Excutor创建完成后,Worker向Master发送ExcutorStatusChanged消息,通知Master Excutor已经创建完成
  4. Master收到该消息后,向Driver发送ExcutorUpdated消息,通知它Excutor已经创建好,可以运行task了
<5>. 启动Task执行

粉色虚线,和图有一点出入,具体可参考spark运行原理,搜索"receiveOffer"

  1. Driver接收到ExcutorUpdated消息后,Excutor的CoarseGrainedExcutorBackend不断向DriverEndpoint发送ReceiveOffers消息,汇报资源使用情况
  2. DriverEndpoint收到该消息后,获取可用的excutor
  3. TaskScheduler通过DriverEndpoint的LauchTask消息将具体Task发送给CoarseGrainedExcutorBackend
  4. CoarseGrainedSchedulerBackend调用launchTasks方法把任务发送给对应的ExecutorBackend进行执行
<6>. Task运行完成
  1. Excutor向CoarseGrainedExcutorBackend报告运行完成
  2. CoarseGrainedExcutorBackend向Driver发送StatusUpdate消息,告知Driver该任务完成
  3. Driver继续调度剩下的任务
  4. 当Driver所有任务完成后,会通知Master,Master会通知Worker,Worker会结束其控制的Excutor的JVM

扩展资料:
Spark源码之Executor&CoarseGrainedExecutorBackend


猛男落泪为offer
22 声望5 粉丝

半路出家大数据