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

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

详细过程:
当Master启动后,随之启动个Worker,Worker启动是会创建消息通信环境RpcEnv和终端点EndPoint,并向Master发送注册Worker的消息RegisterWorker。
由于Worker可能需要注册到多个Master中,在Worker的tryRegisterAllMasters方法中创建注册线程池registerMasterThreadPool,把需要申请注册的请求放在该线程池中,然后通过该线程池启动注册线程。在该注册过程中,获取Master终端店引用,截止调用RegisterWithMaster方法,根据master终端店引用的send方法发送注册RegisterWorker消息。
Master收到消息后,需要对Worker发送的消息进行验证,记录。如果注册成功,则发送RegisteredWorker消息给对应的Worker,告诉他已经完成注册,随之进行步骤3,Worker定期发送心跳信息给Master;如果注册失败,则发送registerWorkerFailed消息。
在Master中,Master接到注册消息后,先判断Master当前状态是否是standby,如果是则忽略注册消息。如果在注册列表中发现该Worker的编号,则返回重复注册的失败消息,如果没有问题,则使用registerWorker方法把该Worker加入到列表中。
Spark 运行时消息通信

用户提交应用程序时,应用程序的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处理结果并回收资源。