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