Spark源码解析(二)集群启动脚本分析

通过学习Spark源码为了更深入的了解Spark。主要按照以下流程进行Spark的源码分析,包含了Spark集群的启动以及任务提交的执行流程:

  1. Spark RPC分析
  2. start-all.sh
  3. Master启动分析
  4. Work启动分析
  5. spark-submit.sh脚本分析
  6. SparkSubmit分析
  7. SparkContext初始化

2.start-all.sh

源码分析,我这里使用的Spark版本是Spark2.4.7。使用scala版本是Scala2.11。

1.start-all.sh  内部执行start-master.sh和start-slaves.sh。

if [ -z "${SPARK_HOME}" ]; then
  export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi

# Load the Spark configuration
. "${SPARK_HOME}/sbin/spark-config.sh"

# Start Master
"${SPARK_HOME}/sbin"/start-master.sh

# Start Workers
"${SPARK_HOME}/sbin"/start-slaves.sh

2.start-master.sh和start-slaves.sh都有调用spark-daemon.sh

start-master.sh

"${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


start-slaves.sh

"${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS $WORKER_NUM \
   --webui-port "$WEBUI_PORT" $PORT_FLAG $PORT_NUM $MASTER "$@"

3.spark-daemon.sh内部调用spark-class最终转到执行

  • Master启动:spark-class org.apache.spark.deploy.master.Master
  • Worker启动:spark-class org.apache.spark.deploy.worker.Worker

最终会跳到对应的main方法。

3.Master启动分析

    def main(argStrings: Array[String]) {
        Thread.setDefaultUncaughtExceptionHandler(new SparkUncaughtExceptionHandler(exitOnUncaughtException = false))
        
        // TODO 注释:初始化日志输出
        Utils.initDaemon(log)
        
        // TODO 注释:创建conf对象其实是读取Spark默认配置的参数
        val conf = new SparkConf
        
        /**
          *
          * 1.解析main方法传入的参数
          * 2.解析配置文件,加载集群启动时需要解析的配置文件。
          */
        val args = new MasterArguments(argStrings, conf)
        
        // TODO 注释:初始化RPC服务和终端
        /**
、
         *   注释:
         *   1、RpcEnv
         *   2、Endpoint
         */
        val (rpcEnv, _, _) = startRpcEnvAndEndpoint(args.host, args.port, args.webUiPort, conf)
        
        // TODO 注释: 等待结束
        rpcEnv.awaitTermination()
    }

分析startRpcEnvAndEndpoint方法。这里初始化RpcEnv和启动MsterEndpoint。

  def startRpcEnvAndEndpoint(host: String, port: Int, webUiPort: Int, conf: SparkConf): (RpcEnv, Int, Option[Int]) = {
        
        // TODO 注释:初始化securityManager
        val securityMgr = new SecurityManager(conf)
        
        // TODO 注释:初始化RPCEnv
        val rpcEnv = RpcEnv.create(SYSTEM_NAME, host, port, conf, securityMgr)
        
        // TODO 注释:向RPC注册master终端,涉及到Master的实例化
        /**
         *   注释: rpcEnv.setupEndpoint 会直接初始化和启动 EndPoint
         *   参数解析
         *   1、ENDPOINT_NAME endpoint的名字
         *   2、new Master()  endpoint 实例对象
         *   由于这个 endpoint 就是 Master实例:所以代码跳转到两个地方:
         *   1、master的构造法方法
         *   2、master的 onStart()
         *      做了三件事:
         *      1、启动 master web ui
         *      2、启动定时任务检查 worker 状态
         *      3、如果启用了 HA,则 master 参与选举
         */
        val masterEndpoint = rpcEnv.setupEndpoint(ENDPOINT_NAME, new Master(rpcEnv, rpcEnv.address, webUiPort, securityMgr, conf))
        
        // TODO 注释:rest的绑定端口
        val portsResponse = masterEndpoint.askSync[BoundPortsResponse](BoundPortsRequest)
        
        // TODO 注释:返回结果
        (rpcEnv, portsResponse.webUIPort, portsResponse.restPort)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值