我们经常通过spark-submit来提交spark应用程序,那么让我们一起看一下这里面到底发生了什么吧。

知识点:

1.CLI命令行界面启动Spark应用程序

Unix有两种方式:1)spark-submit 2)spark-class。前者是我们常见的方式,后者是spark集群内部使用的方式。spark-submit实际上是调用spark-class来提交应用程序的,所以本质上是一种方式。

Win中有两种方式:1)spark-submit.cmd 2)spark-class.cmd。spark-submit.cmd调用spark-class.cmd,spark-class.cmd调用spark-class2.cmd来完成的。

2.SparkSubmit.scala详解

SparkSubmit.scala包含3个Object和一个class,分别是SparkSubmit、SparkSubmitAction、SparkSubmitUtils和OptionAssigner。

(1)SparkSubmitAction是一个只允许在deploy包中访问的枚举子类,用来判断sparksubmit命令的请求类型。代码如下:

private[deploy] object SparkSubmitAction extends Enumeration {
  type SparkSubmitAction = Value
  val SUBMIT, KILL, REQUEST_STATUS = Value
}

(2)SparkSubmitUtils也是一个Object,由名字就可知它是一个sparksubmit的辅助类,主要用于一些参数的处理及maven相关依赖的处理

(3)SparkSubmit是一个非常重要的Object。

主要的几个字段如下所示:

// 集群管理

private val YARN = 1

private val STANDALONE = 2

private val MESOS = 4

private val LOCAL = 8

private val ALL_CLUSTER_MGRS = YARN | STANDALONE | MESOS | LOCAL

// 部署模式

private val CLIENT = 1

private val CLUSTER = 2

private val ALL_DEPLOY_MODES = CLIENT | CLUSTER

我们可以看出,平时我们熟悉的这些字符串可能就只是一个整数而已

主要的几个方法如下所示:

  • main方法如下所示:

def main(args: Array[String]): Unit = {

val appArgs = new SparkSubmitArguments(args)

if (appArgs.verbose) {

// scalastyle:off println

printStream.println(appArgs)

// scalastyle:on println

}

appArgs.action match {

//通过spark-submit提交应用程序

case SparkSubmitAction.SUBMIT => submit(appArgs)

//通过spark-submit取消应用程序,目前只支持standalone cluster模式

case SparkSubmitAction.KILL => kill(appArgs)

//通过spark-submit请求得到应用程序,目前只支持standalone cluster模式

case SparkSubmitAction.REQUEST_STATUS => requestStatus(appArgs)

}

}

  • submit方法中首先通过CLI传递过来的参数,设置不同模式下的合适的类路径、系统属性及应用参数,然后创建环境运行应用程序的Main方法,submit方法如下所示:

private def submit(args: SparkSubmitArguments): Unit = {

val (childArgs, childClasspath, sysProps, childMainClass) = prepareSubmitEnvironment(args)

def doRunMain(): Unit = {

if (args.proxyUser != null) {

val proxyUser = UserGroupInformation.createProxyUser(args.proxyUser,

UserGroupInformation.getCurrentUser())

try {

proxyUser.doAs(new PrivilegedExceptionAction[Unit]() {

override def run(): Unit = {

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

}

})

} catch {

} else {

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

}

}

if (args.isStandaloneCluster && args.useRest) {

try {

printStream.println("Running Spark using the REST application submission protocol.")

doRunMain()

} catch {

}

} else {

doRunMain()

}

}

由代码可知submit调用doRunMain方法,然后doRunMain方法调用runMain方法触发应用程序的main方法。详细请看上图

  • kill方法如下所示:利用CLI传递过来的子任务ID和master通过Post方式取消任务

private def kill(args: SparkSubmitArguments): Unit = {

new RestSubmissionClient(args.master)

.killSubmission(args.submissionToKill)

}

  • requestStatus方法如下所示:利用CLI传递过来的子任务ID和master通过Get方式得到任务的具体信息

private def requestStatus(args: SparkSubmitArguments): Unit = {

new RestSubmissionClient(args.master)

.requestSubmissionStatus(args.submissionToRequestStatusFor)

}

【原】spark-submit提交应用程序的内部流程的更多相关文章

  1. Spark提交应用程序之Spark-Submit分析

    1.提交应用程序 在提交应用程序的时候,用到 spark-submit 脚本.我们来看下这个脚本: if [ -z "${SPARK_HOME}" ]; then export S ...

  2. spark下使用submit提交任务后报jar包已存在错误

    使用spark submit进行任务提交,离线跑数据,提交后的一段时间内可以application可以正常运行.过了一段时间后,就抛出以下错误: org.apache.spark.SparkExcep ...

  3. 【原创】大数据基础之Spark(1)Spark Submit即Spark任务提交过程

    Spark2.1.1 一 Spark Submit本地解析 1.1 现象 提交命令: spark-submit --master local[10] --driver-memory 30g --cla ...

  4. spark submit参数及调优

    park submit参数介绍 你可以通过spark-submit --help或者spark-shell --help来查看这些参数.   使用格式:  ./bin/spark-submit \   ...

  5. 【Spark-core学习之四】 Spark任务提交

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  6. Spark(五)Spark任务提交方式和执行流程

    一.Spark中的基本概念 (1)Application:表示你的应用程序 (2)Driver:表示main()函数,创建SparkContext.由SparkContext负责与ClusterMan ...

  7. spark submit参数及调优(转载)

    spark submit参数介绍 你可以通过spark-submit --help或者spark-shell --help来查看这些参数. 使用格式:  ./bin/spark-submit \ -- ...

  8. Spark作业提交至Yarn上执行的 一个异常

    (1)控制台Yarn(Cluster模式)打印的异常日志: client token: N/A         diagnostics: Application application_1584359 ...

  9. Spark学习(四) -- Spark作业提交

    标签(空格分隔): Spark 作业提交 先回顾一下WordCount的过程: sc.textFile("README.rd").flatMap(line => line.s ...

随机推荐

  1. JsTree异步加载数据实现多级菜单

    最近在搞一个项目的维护,有一个问题是把原来的树导航变成多级的,原来的那个导航是JsTree的,但我又不熟悉,遂头疼了好久... 终于,他还是出来了,下面就贴上主要代码和思路,因为我在搞这个东西的时候在 ...

  2. 13个Cat命令管理(显示,排序,建立)文件实例

    在Linux系统中,大多数配置文件.日志文件,甚至shell脚本都使用文本文件格式,因此,Linux系统存在着多种文本编辑器,但当你仅仅想要查看一下这些文件的内容时,可使用一个简单的命令-cat. c ...

  3. DBMS_SCHEDULER and DBMS_JOB

    引用原文:http://foolraty.iteye.com/blog/1107803 For DBMS_JOB usage:To find out more information about th ...

  4. hdu 3157 Crazy Circuits 有源汇和下界的最小费用流

    题目链接 题意:有n个节点,m个用电器.之后输入m行每行三个整数a,b,c; 节点a为正极(或者a 为 '+'即总的正极),b为该用电器的负极(b = '-'表示总的负极),c为该用电器要正常工作最小 ...

  5. 用最直白的语言告诉你,hadoop是什么?

    hadoop应历史之潮流,随着理论探索.科学技术试验的不断开展,hadoop终于2006年问世,惊天地泣鬼神! hadoop雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java ...

  6. Hadoop学习—最大的敌人是自己

    (大讲台:国内首个it在线教育混合式自适应学习) 如果没有那次学习机会,我依然深陷在封闭的泥塘里. 我是今年刚毕业的大学生,我学习成绩不错,所学也是国内很厉害的专业,全国范围内只有6所院校拥有学位授予 ...

  7. IE浏览器窗口合并

    百度经验:如何在IE上设置多窗口合并为单窗口(可切换)?

  8. AJAX技术的核心

    //创建一个XMLHttpRequest对象 ,利用此对象与服务器进行通信 是AJAX技术的核心 /** * 获取XmlHttpRequest对象 */ function getXMLHttpRequ ...

  9. js为链接绑定点击事件并且附带return false;来阻止跳转

    <!DOCTYPE HTML> <html> <head> <meta charset="gb2312" /> <title& ...

  10. PHP7正式版测试,性能惊艳!

    本周迎来2015年编程语言界的两件大事,Swift7 开源, PHP7 发布.这两件大事,都是可以载入相应的编程语言的史册级的事件. Swift 开源的事,咱先不说了,知乎上也有热烈的讨论,我们今天就 ...