启动Spark的Master,不管是执行start-all.sh还是直接在master节点直接启动start-master.sh,都会进入spark-master.sh开始。这里只是对Master的启动流程进行追踪,脚本的具体解析可以参照前篇,具体的Master实例化后面再解读。
脚本解析:Spark源码解析之启动脚本解析
首先进入spark-master.sh
start-master.sh
这个脚本最终调用了spark-daemon.sh。因为没有输入参数,所以$ORIGINAL_ARGS为空。最后传入参数:
start org.apache.spark.deploy.master.Master 1 --host hostname --port 7077 --webui-port 8080
# 启动spark-daemon脚本,参数为:start、$CLASS、1、host、port、webUI-port、$ORIGINAL_ARGS
# 直译为:
# sbin/spark-daemon.sh start org.apache.spark.deploy.master.Master 1 --host cdh-master --port 7077
# --webui-port 8080
"${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
脚本最终执行了以下方法,execute_command方法是决定在前台还是后台运行,也就是调用了spark-class:
nice -n 0 /bin/spark-class org.apache.spark.deploy.master.Master --host cdh-master --port 7077 --webui-port 8080
case "$mode" in
# nice -n 指定优先级执行,$SPARK_NICENESS是前面指定的优先级0
# bash 执行后面的脚本
# 如果参数是class,即start
# 直译为:
# execute_commamd nice -n 0 bin/spark-class org.apache.spark.master.Master --host cdh-master
# --port 7077 --webui-port 8080
(class)
execute_command nice -n "$SPARK_NICENESS" "${SPARK_HOME}"/bin/spark-class "$command" "$@"
;;
# 直译为:
# execute_commamd nice -n 0 bin/spark-submit org.apache.spark.master.Master --host cdh-master
# --port 7077 --webui-port 8080
(submit)
execute_command nice -n "$SPARK_NICENESS" bash "${SPARK_HOME}"/bin/spark-submit --class "$command" "$@"
;;
(*) # 其他报错退出
echo "unknown mode: $mode"
exit 1
;;
esac
spark-class
这里调用了org.apache.spark.launcher.Main:
java -Xmx128m -cp ...\jars\* org.apache.spark.launcher.Main org.apache.spark.deploy.master.Master --host cdh-master --port 7077 --webui-port 8080
# 调用执行文件目录下的org.apache.spark.launcher.Main方法
# 传入执行类及参数,解析后返回执行命令
build_command() {
"$RUNNER" -Xmx128m -cp "$LAUNCH_CLASSPATH" org.apache.spark.l