这个类是真正的执行者,我们好好看看这个真正的入口在哪里?
首先,依然是设置项目主目录:
if [ -z "${SPARK_HOME}" ]; then
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
然后,配置一些环境变量:
. "${SPARK_HOME}"/bin/load-spark-env.sh
在spark-env中设置了assembly相关的信息。
然后寻找java,并赋值给RUNNER变量
# Find the java binary
if [ -n "${JAVA_HOME}" ]; then
RUNNER="${JAVA_HOME}/bin/java"
else
if [ `command -v java` ]; then
RUNNER="java"
else
echo "JAVA_HOME is not set" >&2
exit 1
fi
fi
中间是一大坨跟assembly相关的内容。
最关键的就是下面这句了:
CMD=()
while IFS= read -d '' -r ARG; do
CMD+=("$ARG")
done < <("$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@")
exec "${CMD[@]}"
首先循环读取ARG参数,加入到CMD中。然后执行了"$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@这个是真正执行的第一个spark的类。
org.apache.spark.launcher.Main的参考如下
。1、首先在spark-class中通过Main [class] [classArgs]的方式将SparkSubmit或者Master、Worker以参数的方式传入
2、Main中的main方法获取到spark-class传过来的className,判断是否为SparkSubmit
3、如果是SparkSubmit就通过实例化SparkSubmitCommandBuilder并调用buildCommand方法来创建供spark-class中exec执行的command
4、如果是其他的类(例如Master或者Worker等)就会实例化SparkClassCommandBuilder并调用buildCommand方法来创建供spark-class中exec执行的command
5、3和4生成的command最终都会交给spark-class中的exec来执行,生成具体的进程:根据3生成的command创建的就是SparkSubmit进程,用来提交应用程序;根据4生成的command创建的就是Master、Worker等进程。
Spark 2.2 任务提交流程

本文详细解析了Spark 2.2版本中任务提交的过程,从spark-shell的启动到spark-submit脚本的使用,再到SparkSubmit类的具体执行流程。
957

被折叠的 条评论
为什么被折叠?



