在standalone模式下运行时的消息通信过程分以下两个阶段:
一、spark集群启动时的消息通信过程
当启动master后(start-master.sh),随之启动各个worker(start-slave.sh spark://whz:7077)。worker节点向master节点发送注册消息如图所示
master收到消息后需要对worker发送的信息进行验证记录。如果注册成功则发送RegisteredWorker消息给对应的worker,告诉worker已经完成注册,随后注册成功的worker会定时发送心跳消息给master;如果注册失败则会发送RegisterWorkerFailed消息,worker打印出错日志并结束worker的启动。master发送注册成功消息情况如图所示
二、spark集群运行作业时的消息通信过程
用户提交应用程序时,例如启动spark-shell(spark-shell --master spark://whz:7077),应用程序的SparkContext会向master发送应用注册消息,master收到消息如图所示
master处理消息完后会给该应用分配Executor,即向存活的worker发送启动Executor进程的消息(即LaunchExecutor消息),worker收到消息后的动作如图所示
可看出worker收到消息后会进行验证记录然后实例化ExecutorRunner对象,在ExecutorRunner启动中会创建进程生成器ProcessBuilder,然后由该生成器使用command创建CoarseGrainedExecutorBackend对象,该对象是Executor运行的容器,最后worker发送ExecutorStateChanged消息给master,通知Executor容器已经创建完毕。该过程如图所示:
如果应用被kill或失败或运行结束退出,则SparkContext会向master发送取消应用注册消息,如下所示
master收到消息后通知worker杀掉该应用对应的Executor并通知master,如下所示
注意:如果启动spark-shell或spark-sql不带--master spark://whz:7077参数指定管理集群资源分配的master,则该应用是以local的方式运行在本地环境,不属于分布式计算,以spark-shell为例带--master参数和不带两种提交应用方式差距如下两图所示:
并且不带--master参数指定sparkmaster启动应用如spark-shell时,此时的Spark Master 和Spark Worker的WEB UI上 (http://localhost:8080/对应spark://whz:7077、http://localhost:8081/对应127.0.0.1:55796)不会有应用程序的记录信息和运行该应用的Executor记录信息,如下两图所示: