2.3 Spark 启动流程分析
本章分析 Standalone 模式下 Spark 启动流程

start-all.sh脚本,实际是执行java -cp Master和java -cp Worker;Master启动时首先创建一个RpcEnv对象,负责管理所有通信逻辑;Master通过RpcEnv对象创建一个Endpoint,Master就是一个Endpoint,Worker可以与其进行通信;Worker启动时也是创建一个RpcEnv对象;Worker通过RpcEnv对象创建一个Endpoint;Worker通过RpcEnv对象建立到Master的连接,获取到一个RpcEndpointRef对象,通过该对象可以与Master通信;Worker向Master注册,注册内容包括主机名、端口、CPU Core数量、内存数量;Master接收到Worker的注册,将注册信息维护在内存中的Table中,其中还包含了一个到Worker的RpcEndpointRef对象引用;Master回复Worker已经接收到注册,告知Worker已经注册成功;Worker端收到成功注册响应后,开始周期性向Master发送心跳。
1. start-master.sh Master 启动脚本分析
启动 Master 的主要 shell 流程
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
spark-daemon.sh
    case $option in
      (start)
        run_command class "$@"
        ;;
    esac
    run_command() {
      mode="$1"
      case "$mode" in
        (class)
          execute_command nice -n "$SPARK_NICENESS" "${SPARK_HOME}"/bin/spark-class "$command" "$@"
          ;;
      esac
    }
    execute_command() {
      if [ -z ${SPARK_NO_DAEMONIZE+set} ]; then
          # 最终以后台守护进程的方式启动 Master
          nohup -- "$@" >> $log 2>&1 < /dev/null &
      fi
    }
启动类: 
    /opt/module/spark-standalone/bin/spark-class org.apache.spark.deploy.master.Master 
            --host hadoop201 
            --port 7077 
            --webui-port 8080
bin/spark-class
    启动命令:
    /opt/module/jdk1.8.0_172/bin/java 
        -cp /opt/module/spark-standalone/conf/:/opt/module/spark-standalone/jars/* 
        -Xmx1g org.apache.spark.deploy.master.Master 
        --host hadoop201 
        --port 7077 
        --webui-port 8080
2. start-slaves.sh Worker 启动脚本分析
启动 Worker 的主要 shell 流程
start-slaves.sh
    "${SPARK_HOME}/sbin/slaves.sh" cd "${SPARK_HOME}" \; "${SPARK_HOME}/sbin/start-slave.sh" "spark://$SPARK_MASTER_HOST:$SPARK_MASTER_PORT"
start-slave.sh
    # worker类
    CLASS="org.apache.spark.deploy.worker.Worker"
    if [ "$SPARK_WORKER_WEBUI_PORT" = "" ]; then
        # worker webui 端口号
        SPARK_WORKER_WEBUI_PORT=8081   
    fi
    if [ "$SPARK_WORKER_INSTANCES" = "" ]; then
      start_instance 1 "$@"
    fi
    # 启动worker实例  spark-daemon.sh在启动Master的时候已经使用过一次了
    function start_instance {
      "${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS $WORKER_NUM \
         --webui-port "$WEBUI_PORT" $PORT_FLAG $PORT_NUM $MASTER "$@"
    }
最终启动类:
    /opt/module/spark-standalone/bin/spark-class org.apache.spark.deploy.worker.Worker 
            --webui-port 8081 
            spark://hadoop201:7077
bin/spark-class
    启动命令:
    opt/module/jdk1.8.0_172/bin/java 
        -cp /opt/module/spark-standalone/conf/:/opt/module/spark-standalone/jars/* 
        -Xmx1g org.apache.spark.deploy.worker.Worker 
        --webui-port 8081 
        spark://hadoop201:7077