Spark源码分析-应用程序到底是如何提交到Spark并运行的?

网上有不少关于Spark应用程序提交流程分析的文章,有的鞭辟入里、有的浅尝辄止。但由于Spark代码版本更迭或关注点的缘故,总有一些自己想知道的细节不能系统的获取。所以打算基于spark-2.4.4(3.0-release版本还未发版),记录下自己对Spark应用程序提交和运行流程源码的一些分析和理解,同时通过打断点代码调试的方式,将完整的代码执行流程分享给大家,希望能做到真正的手把手带你读Spark源码的目的。

当然,由于水平所限,其中肯定有理解不够深入和透彻的地方,欢迎积极吐槽、交流学习、一起进步~

如上图所示,Spark应用程序的提交和运行流程,顾名思义分为提交过程和运行过程。其中提交过程,我将其定义为从用户在客户端执行提交命令开始,到进入用户应用程序代码逻辑(main函数)这个过程;运行流程的话,主要是指用户应用程序的代码逻辑是如何进入到Spark的处理逻辑、Spark的核心组件如Driver、Executor、DAGScheduler、TaskScheduler等是什么时候创建的、Application是如何被划分为Stage、Job、Task、并最终在Executor上运行task的过程。

为了更好的梳理整个过程中Spark源码的执行流程,这里我以spark-2.4.4版本代码,通过spark-submit提交SparkPi应用程序到yarn集群的client部署模式为例,进行Spark源码debug调试的跟踪分析。

不知道如何对Spark源码进行远程调试?看这里:Spark源码分析(零):一定要学会的Spark源码远程调试方法remote debug

提交命令如下:

hadoop@master:/software/servers/spark$ \
> spark-submit \
> --master yarn \
> --deploy-mode client \
> --class org.apache.spark.examples.SparkPi \
> /data0/spark/spark-2.4.4-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.4.jar

直白点讲,用户通过spark-submit加一堆参数的方式,提交Spark应用程序。看下spark-submit脚本中有什么:

if [ -z "${SPARK_HOME}" ]; then
  source "$(dirname "$0")"/find-spark-home
fi

# disable randomized hash for string in Python 3.3+
export PYTHONHASHSEED=0
# 这里可以加个输出,更清楚的知道具体的调用命令
# echo "${SPARK_HOME}"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@"
exec "${SPARK_HOME}"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@"

这里调用了spark-class脚本并追加了org.apache.spark.deploy.SparkSubmit参数。这个参数是干什么的呢? 不知道。脚本中可以加个输出,这样我们就能更清楚的知道下一步的具体调用命令:

/software/servers/spark/bin/spark-class org.apache.spark.deploy.SparkSubmit --master yarn --deploy-mode client --class org.apache.spark.examples.SparkPi /data0/spark/spark-2.4.4-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.4.jar

程序继续运行,以上述命令进入spark-class脚本:

 

你可能感兴趣的:(Spark源码分析)