欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

程序员文章站 2024-02-25 11:07:04
...

Spark 部署模式

(1)Standalone:独立模式,Spark原生的简单集群管理器,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统,使用Standalone可以很方便地搭建一个集群;
(2)Hadoop YARN:统一的资源管理机制,在上面可以运行多套计算框架,如MR、Storm等。根据Driver在集群中的位置不同,分为yarn client和yarn cluster;
(3)Apache Mesos:一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括Yarn。
在实际工厂环境下使用的绝大多数的集群管理器是Hadoop YARN

YARN Cluster模式

(1)执行脚本提交任务,实际是启动一个SparkSubmit的JVM进程;
(2)SparkSubmit类中的main方法反射调用Client的main方法;
(3)Client创建Yarn客户端,然后向Yarn发送执行指令:bin/java ApplicationMaster;
(4)Yarn框架收到指令后会在指定的NM中启动ApplicationMaster;
(5)ApplicationMaster启动Driver线程,执行用户的作业;
(6)AM向RM注册,申请资源;
(7)获取资源后AM向NM发送指令:bin/java CoarseGrainedExecutorBacken;
(8)ExecutorBackend进程会接收消息,启动计算对象Executor并跟Driver通信,注册已经启动的Executor;
(9)Driver分配任务并监控任务的执行。
SparkSubmit、ApplicationMaster和CoarseGrainedExecutorBacken是独立的进程;
Client和Driver是独立的线程;
Executor是一个对象。

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

程序提交入口类

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

任务提交SparkSubmit

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

打印spark操作源码

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

main()方法

// 在new SparkSubmitArguments()中action默认为Submit
 action = Option(action).getOrElse(SUBMIT)

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

提交程序 submit(appArgs)

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

准备提交环境prepareSubmitEnvironment()

// 集群
if (isYarnCluster)      ==> childMainClass = "org.apache.spark.deploy.yarn.Client"
// 客户端
if (deployMode==CLIENT) ==> childMainClass = args.mainClass("用户类")

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪
Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

继续向下执行

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

doRunMain()过度方法,会最终指向runMain()方法

if…else都会执行runMain,只是if里面会判断是否时代理用户做一点操作

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

runMain()具体方法

// 通过反射,声明Class对象并赋值
var mainClass = Utils.classForName(childMainClass)

// 在准备提交环境中,childMainClass的值为下
childMainClass = "org.apache.spark.deploy.yarn.Client"
childMainClass = args.mainClass("用户类")

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

获取类中main方法:mainClass.getMethod(“main”, new ArrayString.getClass)

// 通过类对象获取mainClass中的main方法
val mainMethod = mainClass.getMethod("main", new Array[String](0).getClass)

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

通过invoke执行main方法(): mainMethod.invoke(null, childArgs.toArray)

执行mainClass中的main方法

Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪

小结

org.apache.spark.deploy.SparkSubmit

//1.程序入口
main()

//2.提交程序
submit(appArgs)

//3.准备提交环境
val (childArgs, childClasspath, sysProps, childMainClass) = prepareSubmitEnvironment(args)
if (isYarnCluster)      ==> childMainClass = "org.apache.spark.deploy.yarn.Client"
if (deployMode==CLIENT) ==> childMainClass = args.mainClass("用户类")

//4. 过渡
doRunMain()

//5. 
runMain(childArgs, childClasspath, sysProps, childMainClass, args.verbose)

//6.声明Class对象并赋值
var mainClass: Class[_] = Utils.classForName(childMainClass)

//7.获取mainClass中的main方法
val mainMethod = mainClass.getMethod("main", new Array[String](0).getClass)

//8.执行mainClass中的main方法
mainMethod.invoke(null, childArgs.toArray)