在该系列博客中,源码分析的大致流程是从脚本开始分析,然后再分析代码的执行流程
- 分析脚本是首先分析脚本的内容,然后再debug执行脚本,结合脚本原内容进行学习
1. start-master.sh脚本内容
start-master.sh 脚本的功能是启动master节点
# 判断是否配置了SPARK_HOME,如果没有设置则先通过$0获取当前脚本的文件名
# 再通过dirname获取sbin目录,再cd回上级目录,pwd获取绝对路径,以此设置SPARK_HOME
if [ -z "${SPARK_HOME}" ]; then
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
# NOTE: This exact class name is matched downstream by SparkSubmit.
# Any changes need to be reflected there.
# 定义CLASS变量
CLASS="org.apache.spark.deploy.master.Master"
# 判断是否以--help或者-h结尾,如果是的话则打印出脚本使用方法
if [[ "$@" = *--help ]] || [[ "$@" = *-h ]]; then
echo "Usage: ./sbin/start-master.sh [options]"
pattern="Usage:"
pattern+="\|Using Spark's default log4j profile:"
pattern+="\|Registered signal handlers for"
"${SPARK_HOME}"/bin/spark-class $CLASS --help 2>&1 | grep -v "$pattern" 1>&2
exit 1
fi
# 通过$@取出所有参数,并将值赋值给ORIGINAL_ARGS
ORIGINAL_ARGS="$@"
# 通过.加上文件名临时执行spark-config.sh脚本
## 设置SPARK_HOME、SPARK_CONF_DIR以及python的一些环境变量
. "${SPARK_HOME}/sbin/spark-config.sh"
# 通过.加上文件名临时执行load-spark-env.sh脚本
## 设置SPARK_HOME、SPARK_SCALA_VERSION环境变量
. "${SPARK_HOME}/bin/load-spark-env.sh"
# 设置master的通信端口
if [ "$SPARK_MASTER_PORT" = "" ]; then
SPARK_MASTER_PORT=7077
fi
# 设置master的主机地址
if [ "$SPARK_MASTER_HOST" = "" ]; then
# 不同的操作系统使用不同的命令进行查看
case `uname` in
(SunOS)
SPARK_MASTER_HOST="`/usr/sbin/check-hostname | awk '{print $NF}'`"
;;
(*)
SPARK_MASTER_HOST="`hostname -f`"
;;
esac
fi
# 设置master ui端口
if [ "$SPARK_MASTER_WEBUI_PORT" = "" ]; then
SPARK_MASTER_WEBUI_PORT=8080
fi
# 调用spark-daemon.sh脚本,传入master启动所需参数
"${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
2. 调试start-master.sh
sh -x start-master.sh
# 判断是否配置了SPARK_HOME,如果没有设置则先通过$0获取当前脚本的文件名
# 再通过dirname获取sbin目录,再cd回上级目录,pwd获取绝对路径,以此设置SPARK_HOME
+ '[' -z /usr/local/spark ']'
# 定义CLASS变量
+ CLASS=org.apache.spark.deploy.master.Master
# 判断是否以--help或者-h结尾,如果是的话则打印出脚本使用方法
+ [[ '' = *--help ]]
+ [[ '' = *-h ]]
# 通过$@取出所有参数,并将值赋值给ORIGINAL_ARGS
+ ORIGINAL_ARGS=
# 通过.加上文件名临时执行spark-config.sh脚本
## 设置SPARK_HOME、SPARK_CONF_DIR以及python的一些环境变量
+ . /usr/local/spark/sbin/spark-config.sh
++ '[' -z /usr/local/spark ']'
++ export SPARK_CONF_DIR=/usr/local/spark/conf
++ SPARK_CONF_DIR=/usr/local/spark/conf
++ '[' -z '' ']'
++ export PYTHONPATH=/usr/local/spark/python:
++ PYTHONPATH=/usr/local/spark/python:
++ export PYTHONPATH=/usr/local/spark/python/lib/py4j-0.10.7-src.zip:/usr/local/spark/python:
++ PYTHONPATH=/usr/local/spark/python/lib/py4j-0.10.7-src.zip:/usr/local/spark/python:
++ export PYSPARK_PYTHONPATH_SET=1
++ PYSPARK_PYTHONPATH_SET=1
# 通过.加上文件名临时执行load-spark-env.sh脚本
## 设置SPARK_HOME、SPARK_SCALA_VERSION环境变量
+ . /usr/local/spark/bin/load-spark-env.sh
++ '[' -z /usr/local/spark ']'
++ '[' -z '' ']'
++ export SPARK_ENV_LOADED=1
++ SPARK_ENV_LOADED=1
++ export SPARK_CONF_DIR=/usr/local/spark/conf
++ SPARK_CONF_DIR=/usr/local/spark/conf
++ '[' -f /usr/local/spark/conf/spark-env.sh ']'
++ set -a
++ . /usr/local/spark/conf/spark-env.sh
+++ JAVA_HOME=/usr/local/jdk
+++ HADOOP_CONF_DIR=/usr/local/spark/hadoop/etc/hadoop
+++ SPARK_LOCAL_IP=s101
++ set +a
++ '[' -z '' ']'
++ ASSEMBLY_DIR2=/usr/local/spark/assembly/target/scala-2.11
++ ASSEMBLY_DIR1=/usr/local/spark/assembly/target/scala-2.12
++ [[ -d /usr/local/spark/assembly/target/scala-2.11 ]]
++ '[' -d /usr/local/spark/assembly/target/scala-2.11 ']'
++ export SPARK_SCALA_VERSION=2.12
++ SPARK_SCALA_VERSION=2.12
# 设置master的通信端口
+ '[' '' = '' ']'
+ SPARK_MASTER_PORT=7077
# 设置master的主机地址
+ '[' '' = '' ']'
+ case `uname` in
# 不同的操作系统使用不同的命令进行查看
++ uname
++ hostname -f
+ SPARK_MASTER_HOST=s101
# 设置master ui端口
+ '[' '' = '' ']'
+ SPARK_MASTER_WEBUI_PORT=8080
# 调用spark-daemon.sh脚本,传入master启动所需参数:start org.apache.spark.deploy.master.Master 1 --host s101 --port 7077 --webui-port 8080
+ /usr/local/spark/sbin/spark-daemon.sh start org.apache.spark.deploy.master.Master 1 --host s101 --port 7077 --webui-port 8080
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out