Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪
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是一个对象。
程序提交入口类
任务提交SparkSubmit
打印spark操作源码
main()方法
// 在new SparkSubmitArguments()中action默认为Submit
action = Option(action).getOrElse(SUBMIT)
提交程序 submit(appArgs)
准备提交环境prepareSubmitEnvironment()
// 集群
if (isYarnCluster) ==> childMainClass = "org.apache.spark.deploy.yarn.Client"
// 客户端
if (deployMode==CLIENT) ==> childMainClass = args.mainClass("用户类")
继续向下执行
doRunMain()过度方法,会最终指向runMain()方法
if…else都会执行runMain,只是if里面会判断是否时代理用户做一点操作
runMain()具体方法
// 通过反射,声明Class对象并赋值
var mainClass = Utils.classForName(childMainClass)
// 在准备提交环境中,childMainClass的值为下
childMainClass = "org.apache.spark.deploy.yarn.Client"
childMainClass = args.mainClass("用户类")
获取类中main方法:mainClass.getMethod(“main”, new ArrayString.getClass)
// 通过类对象获取mainClass中的main方法
val mainMethod = mainClass.getMethod("main", new Array[String](0).getClass)
通过invoke执行main方法(): mainMethod.invoke(null, childArgs.toArray)
执行mainClass中的main方法
小结
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)
上一篇: YARN提交任务作业(以wordcount样例程序为例)
下一篇: 初始化之线程模型
推荐阅读
-
Spark-Core中Spark 部署模式|Yarn Cluster模式|任务提交SparkSubmit源码追踪
-
在Hadoop集群环境中为MySQL安装配置Sqoop的教程
-
Java策略模式的简单应用实现方法
-
vue中对router路由的总结理解
-
Java中LocalCache本地缓存实现代码
-
Java中的FileInputStream 和 FileOutputStream 介绍_动力节点Java学院整理
-
Java单例模式的应用示例
-
MySQL中查询日志与慢查询日志的基本学习教程
-
python中pandas.DataFrame排除特定行方法示例
-
YARN提交任务作业(以wordcount样例程序为例)