从Spark应用的提交到执行完成有很多步骤,为了便于理解,我们把应用执行的整个过程划分为三个阶段。而我们知道Spark有多种运行模式,不同模式下这三个阶段的执行流程也不相同。

本文介绍这三个阶段的划分,并概要介绍不同模式下各个阶段的执行流程,各个模式的详细流程会在后面的文章进行分析。

应用执行的阶段划分

我们知道,Spark应用可以在多种模式下运行。所谓多种模式主要是针对资源分配方式来说的,Spark应用可以在yarn,k8s,mesos等分布式资源管理平台上运行,也可以启动自带的master和worker端来分配和管理资源(standalone模式)。例如:我们可以通过以下命令来向yarn提交一个spark任务:

$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client $SPARK_HOME/examples/jars/spark-examples*.jar

代码1-3-1 spark应用提交命令

要注意的是,在执行以上应用提交命令时yarn资源管理集群必须已经启动。另外,Spark应用的执行是通过Driver端和Executor端共同配合完成的。

要完成以上应用的执行,需要经历很多步骤,为了便于更好的理解Spark应用从提交到执行完成的整个过程,我们把整个过程划分成三个阶段:

  • 应用的提交
  • 执行环境的准备
  • 任务的调度和执行

如图1所示:

图1 应用执行总体流程

不管以哪种模式运行,Spark应用的执行过程都可以划分成这三个阶段。下面对这三个阶段分别进行说明。

三个阶段概要说明

这三个阶段以及每个阶段要完成的目标如图2所示。

图2 Spark应用执行的3阶段目标概述

​ 图2 Spark应用执行的3阶段目标概述

我们根据以下代码为例,来讲解Spark应用执行的各个阶段。

# HelloWorld.scala
import scala.math.random
import org.apache.spark.sql.SparkSessionobject HelloWorld {def main(args: Array[String]) {val spark = SparkSession.builder.appName("HelloWorld").getOrCreate()val rdd = spark.sparkContext.parallelize(Seq("Hello", "World"))rdd.collect()}
}

第1阶段:应用的提交

这个阶段在Driver端完成,主要目标是:准备依赖包并确定Spark应用的执行主类。具体的任务包括:

  • 解析任务提交的参数,并对参数进行解析和保存。
  • 准备(可能会下载)任务启动参数指定的依赖文件或程序包。
  • 根据Spark应用的执行模式和应用的编写语言,来确定执行的主类名称。
  • 实例化执行主类,生成SparkApplication对象,并调用SparkApplication#start()函数来运行Spark应用(若是Java或scala代码其实是:执行Spark应用中的main函数)。

注意:第1阶段完成时,Driver端并没有向资源管理平台申请任何资源,也没有启动任何Spark内部的服务。

第2阶段:执行环境的准备

通过第1阶段,已经找到了运行在Driver端的Spark应用的执行主类,并创建了SparkApplication对象:app。此时,在app.start()函数中会直接调用主类的main函数开始执行应用,从而进入第2阶段。

第2阶段主要目标是:创建SparkSession(包括SparkContext和SparkEnv),完成资源的申请和Executor的创建。第2阶段完成后Task的执行环境就准备好了。

也就是说,第2阶段不仅会在Driver端进行初始化,而且还要准备好Executor。这一阶段的任务主要是在Driver端执行创建SparkSession的代码来完成,也就是执行下面一行代码:

val spark = SparkSession.builder.appName("HelloWorld").getOrCreate()

第2阶段的Driver端主要完成以下步骤:

  • 创建SparkContext和SparkEnv对象,在创建这两个对象时,向Cluster Manager申请资源,启动各个服务模块,并对服务模块进行初始化。
  • 这些服务模块包括:DAG调度服务,任务调度服务,shuffle服务,文件传输服务,数据块管理服务,内存管理服务等。

第2阶段的Executor端主要完成以下步骤:

  • Driver端向Cluster Manager申请资源,若是Yarn模式会在NodeManager上创建ApplicationMaster,并由ApplicationMaster向Cluster Manager来申请资源,并启动Container,在Container中启动Executor。
  • 在启动Executor时向Driver端注册BlockManager服务,并创建心跳服务RPC环境,通过该RPC环境向Driver汇报Executor的状态信息。

详细的执行步骤,会在后面介绍每种模式的运行原理时,详细分析。第2阶段执行完成后的Spark集群状态如下:

执行环境准备完成后Spark集群的状态

第3阶段:任务的调度和执行

通过第2阶段已经完成了Task执行环境的初始化,此时,在Driver端已经完成了SparkContext和SparkEnv的创建,资源已经申请到了,并且已经启动了Executor。

这一阶段会执行接下来的数据处理的代码:

val rdd = spark.sparkContext.parallelize(Seq("Hello", "World"))
rdd.collect()

第3阶段Driver端主要完成以下步骤:

  • 执行Spark的处理代码,当执行map操作时,生成新的RDD;
  • 当执行Action操作时,触发Job的提交,此时会执行以下步骤:
  • 根据RDD的血缘,把Job划分成相互依赖的Stage;
  • 把每个Stage拆分成一个或多个Task;
  • 把这些Task提交给已经创建好的Executor去执行;
  • 获取Executor的执行状态信息,直到Executor完成所有Task的执行;
  • 获取执行结果和最终的执行状态。

小结

本节介绍了Spark应用的执行过程,通过本节的学习应该对Spark应用的执行过程有一个总体的理解。接下来会根据具体的运行模式来详细分析每个阶段的执行步骤。

spark提交到yarn_如何理解Spark应用的执行过程相关推荐

  1. spark提交到yarn_详细总结spark基于standalone、yarn集群提交作业流程

    最近总结了一些关于spark core的内容,今天先来和大家分享一下spark的运行模式. spark运行模式 (1)local:在本地eclipse.IDEA中写spark代码运行程序,一般用于测试 ...

  2. 深入理解浏览器解析和执行过程

    在我们公司的业务场景中,有很大一部分用户是使用老款安卓机浏览页面,这些老款安卓机性能较差,如果优化不足,页面的卡顿现象会更加明显,此时页面性能优化的重要性就凸显出现.优化页面的性能,需要对浏览器的渲染 ...

  3. linux执行class文件_深入理解linux内核——可执行文件执行过程(2)

    接上篇.. 13.调用do_mmap()函数创建一个新线性区来对可执行文件正文段(即代码)进行映射.这个线性区的起始线性地址依赖于可执行文件的格式,因为程序的可执行代码通常是不可重定位的.因此,这个函 ...

  4. linux 文件可执行_深入理解linux内核——可执行文件执行过程(2)

    接上篇.. 13.调用do_mmap()函数创建一个新线性区来对可执行文件正文段(即代码)进行映射.这个线性区的起始线性地址依赖于可执行文件的格式,因为程序的可执行代码通常是不可重定位的.因此,这个函 ...

  5. WordCount的理解与MapReduce的执行过程

    WordCount的入门 WordCount是最常见.最基本的一个需求,例如进行词频统计.用户访问记录统计.如果数据量非常小的情况下,使用单机.批处理的方式就可以很快得到结果.但是如果数据量非常大,数 ...

  6. Spark性能调优系列:Spark参数配置大全(官网资料)

    Spark参数配置大全 Spark提供了三个位置来配置系统 Spark属性控制大多数应用程序参数,可以使用SparkConf对象或Java系统属性来设置. 通过conf/spark-env.sh每个节 ...

  7. 通过分析一个C程序的汇编指令执行过程,理解计算机的工作。

    郑德伦 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 首先创建一个C程序的文 ...

  8. 《深入理解Spark:核心思想与源码分析》——1.2节Spark初体验

    本节书摘来自华章社区<深入理解Spark:核心思想与源码分析>一书中的第1章,第1.2节Spark初体验,作者耿嘉安,更多章节内容可以访问云栖社区"华章社区"公众号查看 ...

  9. 深入理解spark两种调度模式:FIFO,FAIR模式

    深入理解spark-两种调度模式FIFO,FAIR模式 前面我们应知道了一个任务提交会由DAG拆分为job,stage,task,最后提交给TaskScheduler,在提交taskscheduler ...

最新文章

  1. 1.微型计算机中主要包括有( ).,《微机原理与应用(1)1351》16秋在线作业2
  2. 蓝桥杯练习系统习题-算法训练3
  3. 阿里:马云从未转让和退出淘宝股份 也没有这个打算
  4. Nginx+Tomcat负载均衡、动静分离集群
  5. pyspark.zip/pyspark/worker.py:53: UnicodeWarning: Unicode equal comparison failed to convert both ar
  6. toolbar + DrawerLayout 实现抽屉菜单
  7. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(三)使用初始魔法跟编程魔法世界打个招呼吧
  8. 神通数据库打开服务_数据库周刊30丨数据安全法草案将亮相;2020数据库产业报告;云南电网上线达梦;达梦7误删Redo…...
  9. 利用Runtime为Category添加属性
  10. js 字符串去除空格
  11. java版简易计算器,java 简易计算器
  12. 项目经理需要具备的技能
  13. 我了解的软件测试总结
  14. 研究计算机 英语,高职计算机英语多方法结合研究
  15. 【VOIP】yate sip客户端直接呼叫
  16. Android 打印之将文字转换成 Bitmap 图片,再转换成Bytes 数组 进行打印
  17. ES:java.nio.file.AccessDeniedException: /opt/shan/es/config/elasticsearch.keystore
  18. 【Html】 Html写静态淘宝页面
  19. 顶刊实证复现:排污权交易机制是否提高了企业全要素生产率 (思路梳理+全数据源+python代码)
  20. 裁员潮下的打工人,怎么把手里的饭碗端稳?

热门文章

  1. leetcode 374. Guess Number Higher or Lower 、375. Guess Number Higher or Lower II
  2. pg_rewind 快速角色切换
  3. C++笔记------static 和 const 在类中用法
  4. Jasper报表 自动序列号
  5. Java基础复习笔记系列 七 IO操作
  6. 安装cifs 访问windows的共享文件
  7. SQL SERVER 跨服务器连接
  8. [误将两块磁盘挂载到根目录][解决办法]
  9. android - 小技巧合集(不断更新)
  10. Excel用图标集展示数据