2.3 Spark 启动流程分析

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

查看动画

  1. start-all.sh脚本,实际是执行java -cp Masterjava -cp Worker
  2. Master启动时首先创建一个RpcEnv对象,负责管理所有通信逻辑;
  3. Master通过RpcEnv对象创建一个EndpointMaster就是一个EndpointWorker可以与其进行通信;
  4. Worker启动时也是创建一个RpcEnv对象;
  5. Worker通过RpcEnv对象创建一个Endpoint
  6. Worker通过RpcEnv对象建立到Master的连接,获取到一个RpcEndpointRef对象,通过该对象可以与Master通信;
  7. WorkerMaster注册,注册内容包括主机名、端口、CPU Core数量、内存数量;
  8. Master接收到Worker的注册,将注册信息维护在内存中的Table中,其中还包含了一个到WorkerRpcEndpointRef对象引用;
  9. Master回复Worker已经接收到注册,告知Worker已经注册成功;
  10. 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
Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-06-11 12:34:39

results matching ""

    No results matching ""