Master作为Endpoint的具体实例,下面我们介绍一下Master启动以及OnStart指令后的相关工作
一、脚本概览
下面是一个举例:
/opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/hadoop/ -Xmx1g -XX:MaxPermSize=256m org.apache.spark.deploy.master.Master --host zqh --port 7077 --webui-port 8080
二、启动流程
Master的启动流程如下:
- SparkConf:加载key以spark.开头的系统属性(Utils.getSystemProperties)
- MasterArguments:
- 解析Master启动的参数(--ip -i --host -h --port -p --webui-port --properties-file)
- 将--properties-file(没有配置默认为conf/spark-defaults.conf)中spark.开头的配置存入SparkConf
- NettyRpcEnv中的内部处理遵循RpcEndpoint统一处理,这里不再赘述
- BoundPortsResponse返回rpcEndpointPort,webUIPort,restPort真实端口
- 最终守护进程会一直存在等待结束信awaitTermination
三、OnStart监听事件
Master的启动完成后异步执行工作如下:
- 【dispatcher-event-loop】线程扫描到OnStart指令后会启动相关MasterWebUI(默认端口8080),根据配置选择安装ResetServer(默认端口6066)
- 另外新起【master-forward-message-thread】线程定期进行worker心跳是否超时
- 如果Worker心跳检测超时,那么对Worker下的发布的所有任务所属Driver进行ExecutorUpdated发送,同时自己在重新LaunchDriver
四、RpcMessage处理(receiveAndReply)
消息实例 | 发起方 | 接收方 | 说明 |
RequestSubmitDriver | Client | Master | 提交驱动程序 |
RequestKillDriver | Client | Master | |
RequestDriverStatus | Client | Master | |
RequestMasterState | MasterWebUI | Master | |
BoundPortsRequest | Master | Master | |
RequestExecutors | StandaloneAppClient | Master | |
KillExecutors | StandaloneAppClient | Master |
五、OneWayMessage处理(receive)
消息实例 | 发起方 | 接收方 | 说明 |
ElectedLeader | Master | Master | |
CompleteRecovery | Master | Master | |
RevokedLeadership | Master | Master | |
RegisterWorker | Worker | Master | |
RegisterApplication | StandaloneAppClient | Master | |
UnregisterApplication | StandaloneAppClient | Master | |
ExecutorStateChanged | Worker/ExecutorRunner | Master | |
DriverStateChanged | DriverRunner/Master | Master | |
Heartbeat | Worker | Master | |
MasterChangeAcknowledged | StandaloneAppClient | Master | |
WorkerSchedulerStateResponse | Worker | Master | |
WorkerLatestState | Worker | Master | |
CheckForWorkerTimeOut | Master | Master |
五、Master对RpcMessage/OneWayMessage处理逻辑(选读)
这部分对整体Master理解作用不是很大且理解比较抽象,可以先读后续内容,回头再考虑看这部分内容,或者不读