Spark学习笔记(3) —— 消息通信原理

Spark学习笔记(3) —— 消息通信原理

Spark 消息通信架构

Spark定义了通信框架接口,这些接口实现中调用Netty的具体方法。通信框架使用了工厂设计模式实现,这种设计方式实现了对Netty的解耦,能够根据需要引入其他的消息通信工具。

spark1

Spark 启动消息通信

Spark启动过程中主要是进行Master与Worker之间的通信,首先由Worker节点想Master发送注册消息,然后Master处理完毕后,返回注册成功消息或失败消息,如果成功注册,则Worker定时发送心跳消息给Master。

spark2

详细过程:

  1. 当Master启动后,随之启动个Worker,Worker启动是会创建消息通信环境RpcEnv和终端点EndPoint,并向Master发送注册Worker的消息RegisterWorker。

    由于Worker可能需要注册到多个Master中,在Worker的tryRegisterAllMasters方法中创建注册线程池registerMasterThreadPool,把需要申请注册的请求放在该线程池中,然后通过该线程池启动注册线程。在该注册过程中,获取Master终端店引用,截止调用RegisterWithMaster方法,根据master终端店引用的send方法发送注册RegisterWorker消息。

  2. Master收到消息后,需要对Worker发送的消息进行验证,记录。如果注册成功,则发送RegisteredWorker消息给对应的Worker,告诉他已经完成注册,随之进行步骤3,Worker定期发送心跳信息给Master;如果注册失败,则发送registerWorkerFailed消息。

    在Master中,Master接到注册消息后,先判断Master当前状态是否是standby,如果是则忽略注册消息。如果在注册列表中发现该Worker的编号,则返回重复注册的失败消息,如果没有问题,则使用registerWorker方法把该Worker加入到列表中。

Spark 运行时消息通信

spark3

用户提交应用程序时,应用程序的SparkContext会向Master发送应用注册消息。

Master接收到注册应用信息后,Master将该应用放入应用列表中,并返回RegisteredApplication消息给应用程序。

同时Master在Worker列表中选取运行应用的Worker,发送LaunchExecutor消息给Worker,通知Worker启动Executor。

Executor启动成功后,Worker返回ExecutorStateChanged消息给Master,通知Executor容器已经创建完毕。

同时Executor会向SparkContext发送注册成功消息。

当SparkContext的RDD出发行动操作后,将创建RDD的DAG,通过DAGScheduler进行划分Stage,并将Stage转化为TaskSe。

接着有TaskScheduler向注册的Executor发送执行消息,Executor接收到任务消息后启动并运行。

最后当所有任务运行时,有Driver处理结果并回收资源。