文章目录
概要
上篇文章Spark RPC概述介绍了Spark RPC的实现思路,有了上述基础,我们看一个具体例子,就是standalone模式下的Master和Worker,主要关注Worker如何启动并向Master注册、保持心跳。
在本文中,我们将介绍Master如何启动,并对外提供服务的。
1. Class Master解析
Master是standalone模式下的主节点,查看定义
Master继承ThreadSafeRpcEndpoint,ThreadSafeRpcEndpoint继承RpcEndpoint 。RpcEndpoint的生命周期又是: onStart -> receive(receiveAndReply)* -> onStop (不了解RpcEndpoint的同学点击这里SparkRpc 之 RpcEndpoint、ThreadSafeRpcEndpoint、RpcEnvFactory),所以我们理所当然的关心Master的这四个对应方法。
1.1 Master之onStart()
- 启动基于jetty的webUI。
- 启动定时任务,默认每60s send CheckForWorkerTimeOut信息给Master(如上图注释处),检测Worker连接情况。根据上篇文章,send方法不需要返回值,信息发送给 Master的receive方法,receive使用scala模式匹配处理信息: 检测有没有超时未发送DeadWorkers,,如果有,那么就清除此Worker的信息(RemoveWorker见Master清理信息一文,其他如下 :
上面几段代码,可以清晰的看出Master根据条件lastHeartbeat < currentTime - WORKER_TIMEOUT_MS
判断Worker是否还在发送心跳,如果过期将其从对应集合中删除。lastHeartbeat是Worker最后一次连接的时间,后面讲心跳(Heartbeat)时会讲到。 - 如果配置
spark.master.rest.enabled=true
,启动rest Server
。(参考文章Spark-Submit任务提交中的网关提交方式) - 启动度量系统,
persistenceEngine
,leaderElectionAgent
分别是关于master recovery
和leader
选举。
1.2 Master之receive()
receive方法接收EndpointRef send方法发送的信息,如上面说到的定时检查Worker状态,定义如下
我将源码简单整理,如上图所示,这篇文章只关心第一个部分即检测Worker状态和心跳。
- Worker状态的检测上面刚分析过。
- 心跳机制 : 处理Worker发过来的信息,如果worker信息已经存在则更新lastHeartbeat(在onStart方法中提到),否则重新连接master,也就是注册,下面receiveAndReply方法会讲到。
1.3 Master之recevieAndReply()
receiveAndReply
方法接收EndpointRef ask
及其衍生方法
发送的信息,定义如下
这里面的很多消息,在前面都遇到过,各种注册,请求等等,不再赘述。如果不了解,可以回头去看看系列文章中的Master注册机制分析、SparkSubmit任务提交等文章
1.4 Master之onStop()
主要是关闭webUI等各种服务:
2. Object Master解析
Object Master
主要包含了Main()
方法和startRpcEnvAndEndpoint()
用来进行Master的启动
2.1 Object Master之main()
- 接收参数,包括rpc的host、port(底层netty使用)和webUI server的port,默认如下
startRpcEnvAndEndpoint
方法,初始化RpcEnv,注册Master(RpcEndpoint)到RpcEnv,到这里,上面介绍的生命周期onStart -> receive(receiveAndReply)* -> onStop方法开始工作
2.2 Object Master之startRpcEnvAndEndpoint()
启动流程如下,具体请参考Spark RPC之Netty启动。
总结
结合上一篇文章Spark RPC概述讲解了Master的实现及启动过程,Master是RpcEndpoint的具体实现,。其中主要关注了三点
- Master定时检测Worker连接情况(CheckForWorkerTimeOut)
- Worker信息注册(RegisterWorker)
- 心跳(Heartbeat)
接下来我们看下Worker的实现以及如何向Master注册和发送心跳。