目录
1 总体介绍
本文基于spark2.1.0版本的源码讲解
Spark的运行模式多种多样,灵活多变,部署在单机上时,既可以用本地模式运行,也可以用伪分布模式运行,而当以分布式集群的方式部署时,也有众多的运行模式可供选择,这取决于集群的实际情况,底层的资源调度即可以依赖外部资源调度框架,也可以使用Spark内建的Standalone 模式。对于外部资源调度框架的支持,主要以Yarn进行讲解。
- 单机:local模式、local-cluster(伪分布式)
- 集群:根据是否依赖外部调度框架又分为两大类
- Spark内建:Standalone模式,又分为client和cluster两种部署模式
- 外部调度框架:Mesos模式,yarn模式等,其中yarn又分为client模式和cluster模式
Spark内核架构中重要的组件包括:Application,SparkSubmit,Driver,Master,Worker,SparkContext,Executor,Job,Task,DAG等。
spark程序中各个角色的作用:
- ApplicationMaster:向集群管理器ResourceManager(yarn模式下)注册并且申请资源
- SparkContext:是整个spark应用的上下文,也整个spark应用的生命周期
1、加载配置文件SparkConf,创建SparkEnv,创建TaskScheduler、DAGScheduler
2、用于创建RDD、累加器、广播变量,获取应用的当前状态等 - Driver:spark应用的驱动程序,执行用户main方法,创建sparkConext
- Executor:执行具体任务的进程
注意:在standalone模式下,Spark有显示创建Driver(DriverInfo),Master,Work
类,事实上在基于Yarn模式下,并没有Master,在client模式下是ExecutorLauncher,cluster模式下是ApplicationMaster来充当Master实现资源调度。也没有Worker,而是CoarseGrainedExecutorBackend进程,在这个进程中会注册Executor,只是习惯称Executor运行的节点是Worker。同样,我们称SparkContext的初始化地方叫做Driver。
2 脚本提交流程
当我运行下图这样一个脚本时,通过spark-submit提交应用,它是怎么执行到我们写的代码的呢?
spark-submit脚本位于[SPARK_HOME]/bin目录下,内容如下(注意org.apache.spark.deploy.SparkSubmit这个参数,其实它才是任务提交的真正入口):
实际它执行了spark-class脚本,里面有这样一段代码:
其实是启动了org.apache.spark.launcher.Main这个主类。
在这个类的main方法中会去初始化SparkSubmitCommandBuilder,然后调用buildSparkSubmitCommand()
方法生成cmd命令,其实就是生成了一个java脚本。
这些命令传回spark-class脚本,通过exec命令执行:
其实就是又启动了一个java进程,主类就是前面传入的参数org.apache.spark.deploy.SparkSubmit
SparkSubmit类的作用:它是启动Spark应用程序的主网关,该程序处理Spark依赖项的类路径的设置,并在Spark支持的不同集群管理器和部署模式上提供一个统一控制层。
接下来开始执行SparkSubmit的main方法,它会初始化一个SparkSubmitArguments类,对提交的参数进行解析、封装、校验,然后调用submit方法开始提交应用
重点看prepareSubmitEnvironment()
方法
这里尤其要注意的是mainClass的变化,这决定着不同的模式有不同的初始化方式
prepareSubmitEnvironment()
执行完后,调用runMain()
方法提交