Spark Master启动流程及源码详解

环境:
spark 2.3.3
scala 2.11.8
Java 1.8.0_141
 
${SPARK_HOME}/sbin/start-master.sh
# NOTE: This exact class name is matched downstream by SparkSubmit.
# Any changes need to be reflected there.
CLASS=“org.apache.spark.deploy.master.Master"
...

"${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS 1 \
  --host $SPARK_MASTER_HOST --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT \
  $ORIGINAL_ARGS

调用org.apache.spark.deploy.master.Master$main方法

Spark Master启动流程及源码详解_第1张图片
会调用startRpcEnvAndEndpoint方法启动Master服务。
Master服务的具体启动流程涉及到了Spark Env RPC服务的相关概念。
 
首先,通过RpcEnv.create方法创建RpcEnv。
val rpcEnv = RpcEnv.create(SYSTEM_NAME, host, port, conf, securityMgr)

然后注册Endpoint(Master)

val masterEndpoint = rpcEnv.setupEndpoint(ENDPOINT_NAME,
  new Master(rpcEnv, rpcEnv.address, webUiPort, securityMgr, conf))

Endpoint上Spark RpcEnv中进行消息处理的实体

在rpcEnv.setupEndpoint时会,调用rpcEnv的dispatcher进行注册
org.apache.spark.rpc.netty.Dispatcher$registerRpcEndpoint方法如下:
Spark Master启动流程及源码详解_第2张图片
会将Master对应的Endpoint,拼装成EndpointData,放入endpoints队列中,同时将EndpointData放入receivers队列中。
private val endpoints: ConcurrentMap[String, EndpointData] =
  new ConcurrentHashMap[String, EndpointData]
// Track the receivers whose inboxes may contain messages.
private val receivers = new LinkedBlockingQueue[EndpointData]
...
if (endpoints.putIfAbsent(name, new EndpointData(name, endpoint, endpointRef)) != null) {
  throw new IllegalArgumentException(s"There is already an RpcEndpoint called $name")
}
val data = endpoints.get(name)
endpointRefs.put(data.endpoint, data.ref)
receivers.offer(data)  // for the OnStart message

而在创建EndpointData的时候,

endpoints.putIfAbsent(name, new EndpointData(name, endpoint, endpointRef)

会创建Inbox,存放Endpoint需要处理的消息

Spark Master启动流程及源码详解_第3张图片
而在创建inbox对象的最后,会在inbox的message列表中添一个OnStart事件
Spark Master启动流程及源码详解_第4张图片
 
而Dispatcher在实例化的最后,会创建一个线程池,处理receivers列表中的EndpointData
Spark Master启动流程及源码详解_第5张图片
此时,会取出之前Master Endpoint 进行注册时,放入receivers队列中的EndpointData,调用改EndpointData的inbox对象的process方法处理消息,其实就是封装Master EndpointData时候,最后放入的OnStart事件
Spark Master启动流程及源码详解_第6张图片
此时Master 对应的EndpointData的inbox的process处理逻辑如下:
org.apache.spark.rpc.netty.Inbox$process
Spark Master启动流程及源码详解_第7张图片
取出inbox的messages队列中消息,进行匹配处理,由于是OnStart事件,会调用endpoint的onStart方法处理,即org.apache.spark.deploy.master.Master$onStart
Spark Master启动流程及源码详解_第8张图片
查看spark master的启动日志spark-hadoop-org.apache.spark.deploy.master.Master-1-node01.zf.com.out,会看到onStart方法打印的log
在该日志的最开始,可以看到master的启动命令
在onStart事件的最后,会实例化持久化化存储,也就是HA,会根据spark.deploy.recoveryMode参数进行模式匹配
从启动命令可以看到是zookeeper
Spark Master启动流程及源码详解_第9张图片

你可能感兴趣的:(大数据,Spark,Spark源码)