启动Spark的时候,分别执行${SPARK_HOME}/sbin/start-master.sh和${SPARK_HOME}/sbin/start-slaves.sh两个脚本,下面就先看一下这两个脚本中都做了什么;
(1)${SPARK_HOME}/sbin/start-master.sh:
(1.1)首先将一些配置信息加载到环境变量中:
. "${SPARK_HOME}/sbin/spark-config.sh"
. "${SPARK_HOME}/bin/load-spark-env.sh"
(1.2)然后把取参数中的MasterIP,MasterPort和MasterWebUIPort等,如果没有传递参数,则取默认值:
if [ "$SPARK_MASTER_PORT" = "" ]; then
SPARK_MASTER_PORT=7077
fi
if [ "$SPARK_MASTER_IP" = "" ]; then
SPARK_MASTER_IP=`hostname`
fi
if [ "$SPARK_MASTER_WEBUI_PORT" = "" ]; then
SPARK_MASTER_WEBUI_PORT=8080
fi
(1.3)下面这句话真正启动了Master:
CLASS="org.apache.spark.deploy.master.Master"
......
"${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS 1 \
--ip $SPARK_MASTER_IP --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT \
$ORIGINAL_ARGS
(1.4)spark-daemon.sh主要内容如下:
command=$1
(1.5)spark-class主要内容如下:
(1.6)所以启动Master的时候,实际上是执行了org.apache.spark.deploy.master.Master的main方法,所以后面看Master的方法 的时候,要从这里开始。
(2)${SPARK_HOME}/sbin/start-slaves.sh:
(2.1)首先将一些配置信息加载到环境变量中:
. "${SPARK_HOME}/sbin/spark-config.sh"
. "${SPARK_HOME}/bin/load-spark-env.sh"
(2.2)然后把取参数中的MasterIP,MasterPort和MasterWebUIPort等,如果没有传递参数,则取默认值:
if [ "$SPARK_MASTER_PORT" = "" ]; thenSPARK_MASTER_PORT=7077
fi
if [ "$SPARK_MASTER_IP" = "" ]; then
SPARK_MASTER_IP="`hostname`"
fi
(2.3)下面这句话真正启动了Master:
# Launch the slaves"${SPARK_HOME}/sbin/slaves.sh" cd "${SPARK_HOME}" \; "${SPARK_HOME}/sbin/start-slave.sh" "spark://$SPARK_MASTER_IP:$SPARK_MASTER_PORT"
(2.4)start-slave.sh主要内容如下:
CLASS=" org.apache.spark.deploy.worker.Worker"......
"${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS $WORKER_NUM \
--webui-port "$WEBUI_PORT" $PORT_FLAG $PORT_NUM $MASTER "$@"
(2.5) 所以看Work的源码,需要从org.apache.spark.deploy.worker.Worker看起