一般的启动集群途径是执行位于SPARK_HOME/sbin目录下的start-all.sh脚本文件,我们来看一下这里边都有些什么猫腻(强烈建议,查看本文之前先去学习一下shell的编程基础)。
start-all.sh:
这个文件是一个总控脚本,它会调用其他的脚本来完成整个集群的启动。
#!/usr/bin/env bash
# Licensed to ... --省略授权信息
# Start all spark daemons.--启动所有spark守护进程
# Starts the master on this node.--启动本节点上的Master进程
# Starts a worker on each node specified in conf/slaves--为每一个配置在conf/slaves文件中的节点启动Worker进程
if [ -z "${SPARK_HOME}" ]; then --如果SPARK_HOME变量未定义,则设置环境变量
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
TACHYON_STR=""
while (( "$#" )); do --遍历启动命令后面跟的参数列表
case $1 in
--with-tachyon) --是否设置启动tachyon
TACHYON_STR="--with-tachyon"
;;
esac
shift
done
# Load the Spark configuration --加载执行Spark配置脚本spark-config.sh
. "${SPARK_HOME}/sbin/spark-config.sh"
# Start Master --执行start-master.sh脚本,启动Master进程
"${SPARK_HOME}/sbin"/start-master.sh $TACHYON_STR
# Start Workers --启动所有slaves节点
"${SPARK_HOME}/sbin"/start-slaves.sh $TACHYON_STR
我们看到它里边调用了start-config.sh 和 start-master.sh 和 start-slaves.sh,并且我们还可以在命令行中指定是否启动Tachyon。
接下来看看start-config.sh
start-config.sh
# Licensed to ...
# included in all the spark scripts with source command
# should not be executable directly
# also should not be passed any arguments, since we need original $*
--使用源命令将所有的spark脚本包含进来
--不要直接执行
--也不要传递任何参数,因为我们需要原始的 $*。注:$* 是以将所有向脚本传递的参数拼接成一个字符串
# symlink and absolute path should rely on SPARK_HOME to resolve
--符号链接和绝对路径的解析应该依赖SPARK_HOME
if [ -z "${SPARK_HOME}" ]; then --和上一个文件一样,设置SPARK_HOME变量
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
export SPARK_CONF_DIR="${SPARK_CONF_DIR:-"${
SPARK_HOME}/conf"}"
--设置SPARK_CONF_DIR环境变量
# Add the PySpark classes to the PYTHONPATH:
--添加PySpark类到PYTHONPATH环境变量
export PYTHONPATH="${SPARK_HOME}/python:${PYTHONPATH}"
export PYTHONPATH="${SPARK_HOME}/python/lib/py4j-0.9-src.zip:${PYTHONPATH}"
由上边可以看出来,这个文件主要用来设置几个重要的环境变量:
SPARK_CONF_DIR: spark配置文件目录
PYTHONPATH: python环境的路径
SPARK_HOME/python目录下的文件:
start-master.sh
#!/usr/bin/env bash
# Starts the master on the machine this script is executed on. --启动执行这个脚本所在机器上的Master进程。
if [ -z "${SPARK_HOME}" ]; then
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
# NOTE: This exact class name is matched downstream by SparkSubmit.
--注:这个准确的类名由SparkSubmit匹配。
# Any changes need to be reflected there.--任何改动应该反映在这里
CLASS="org.apache.spark.deploy.master.Master