根据应用执行的3个阶段,不同执行模式下各个阶段的执行逻辑不相同,本文分析不同模式下的执行逻辑。

Yarn-Client模式的执行流程

Yarn的组成

Yarn是hadoop自带的资源管理框架,它的设计思想是:YARN的基本思想是将资源管理和作业调度/监视的功能拆分为单独的守护程序。这个想法是拥有一个全局ResourceManager(RM)和每个应用程序ApplicationMaster(AM)。应用程序可以是单个作业,也可以是作业的DAG。

ResourceManager和NodeManager组成数据计算框架。ResourceManager是在系统中所有应用程序之间仲裁资源的最终权限。NodeManager是每台机器的框架代理,负责容器,监视其资源使用情况(cpu,内存,磁盘,网络),并将其报告给ResourceManager / Scheduler。

每个应用程序ApplicationMaster实际上是框架特定的库,其任务是与来自ResourceManager的资源进行协商,并与NodeManager一起执行和监视任务。

图1 Yarn的组成

Yarn-Client模式下Spark应用的执行流程

Yarn-Client模式下,Driver端会在Client端独立执行,而不像Yarn-Cluster模式会在ApplicationMaster中执行。所以,在Yarn-Client模式下能够观察Driver端的运行,查看Driver端的运行日志。

Yarn-Client模式提交Spark应用的命令类似于:

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

在Yarn-Client模式下,Spark应用的执行总体流程如图2所示。

图2 yarn-client模式spark应用的执行流程

1.客户端提交Spark应用,在提交应用时会先找到Spark应用的执行主类,例如:若是Scala或Java应用,Yarn-Client模式下的执行主类是--class指定的类名。然后,进入主类的main函数开始执行应用。此时,一般会开始创建SparkSession(包括SparkContext和SparkEnv对象),在创建SparkContext时会和ResourceManager进行通信。

2.ResourceManager启动一个Container并在该Container中运行ApplicationMaster。

3.ApplicationMaster根据应用的资源配置来向ResourceManager申请分配一个或多个新的Container,一旦Container被分配就在Container中启动Executors。

4.Driver端直接和Executor进行通信,先把Spark应用程序转换成Task,然后把Task提交给Executor端执行。Executor向Driver端返回执行进度,执行状态,执行完成后返回执行结果。

Yarn-Cluster模式的执行流程

Yarn-Cluster模式下,Driver端会运行在ApplicationMaster的容器中,所以,Yarn-Cluster模式下在Client端不能观察到Driver的运行情况,Driver端的日志也只能在YARN中查看。

Yarn-Cluster模式提交Spark应用的命令如下:

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

Yarn-Cluster模式的Spark应用执行过程如图3所示:

1.客户端提交Spark应用,在提交应用时会先找到Spark应用的执行主类,例如:若是Scala或Java应用,Yarn-Cluster模式下的执行主类org.apache.spark.deploy.yarn.YarnClusterApplication。

然后,进入主类的main函数开始执行应用。此时,一般会开始创建SparkSession(包括SparkContext和SparkEnv对象),在创建SparkContext时会和ResourceManager进行通信。

2.ResourceManager为应用分配一个ApplicationMaster的Container。此时,Driver进程也在该容器中启动。

3.ApplicationMaster向ResourceManager为Executor请求创建容器(container)。当容器创建完成时,就会在该容器中启动Executor。然后Driver直接和Executor进行交流,先把Spark应用程序转换成Task,然后把Task提交给Executor端执行。

4.Executor向Driver端返回执行进度,执行状态,执行完成后返回执行结果。

可以通过SparkUI来查看Yarn-Cluster的Spark应用的执行状态。在Yarn的任务列表中,进入ApplicationMaster的页面,可以查看Spark应用执行的进度日志。

Standalone模式下应用的执行

Standalone的架构和组成

在执行Spark任务前,我们必须启动Standalone资源管理框架,具体的启动和使用方法,见后面的“启动和使用”小节。由于Standalone是由Master和Worker两个部分组成,所以,我们需要先启动Master和Worker服务。

Standalone资源管理框架的架构如图4所示:

图4 Standalone资源管理架构

从图1-5-1可以看出,Standalone的资源管理框架是一master多slave的分布式架构,master服务可以通过zookeeper等组件来保证高可用(后面有专门的章节讲解)。

若和第1.1章节的通用Spark架构进行类比,Standalone模式下的Standalone Master服务,就是Cluster Manager的角色,而Standalone Worker就是worker的角色。

Standalone Master负责:管理Standalone Worker,接受任务提交请求,为任务分配资源等工作;而Standalone Worker负责:启动Executor,运行Task等工作。Spark应用执行时,架构如图1-5-2所示:

图4 Standalone模式任务执行架构

Standalone模式下Spark应用的执行流程

在Standalone模式下执行Spark应用的过程如下:

1.启动Standalone资源管理框架,包括Standalone Master和Standalone Worker;

2.在Driver端指定使用Standalone模式来执行Spark应用,开始进行Task执行环境初始化。

3.Task执行环境的初始化在创建SparkContext时完成,此时,Spark应用连接Standalone Master,向其申请资源,若资源足够,则根据资源配置在Worker端启动指定数量的Executor,并启动和初始化Executor端的各种服务,包括:数据传输服务,内存管理服务。Executor会直接和Driver端通信,把状态信息汇报给Driver端。

4.若一切顺利SparkContext创建完成时,Task的执行环境就准备好了(各个Executor已经创建好,各个必要的服务也已经启动),Driver端接下来开始执行应用程序的Spark数据处理代码,它会对数据处理的过程进行编排,调度,最终形成TaskSet提交给Executor。

5.Executor通过线程池来运行Task,在执行过程中会把状态信息直接返回给Driver端,完成后把结果返回给Driver端。

小结

本文对不同模式下Spark应用的执行过程进行了分析。这并没有对Local模式的执行过程进行分析,会在后面的文章中进行单独分析。

oracle 与 client端执行结果不一致_不同模式下Spark应用的执行过程相关推荐

  1. click 在网页测试手机模式下无效,不能执行。调成非手机模式即可

    click  在网页测试手机模式下无效,不能执行. 调成非手机模式即可 转载于:https://www.cnblogs.com/winyh/p/6419893.html

  2. oracle 与 client端执行结果不一致_Oracle -PLSQLDeveloper 13 数据库连接

    关于oracle 及PLSQLDeveloper 13如何下载,安装流程不一一赘述,网络帖子很多,知乎直接搜索亦可. 本次主要分享:学习前辈们关于安装流程中出现设置报错,应如何处理(本人个例,通过网络 ...

  3. 每隔10秒执行一次_(立下flag)每日10道前端面试题12 关于BOM十问

    第一问:请介绍BOM有哪些对象 第一次被问到时,只知道window和navigator window:BOM的核心对象是window对象,它表示浏览器的一个实例. avigator:navigator ...

  4. Cpython源码分析03(*)_简要总结下Cpython是如何执行python test.py

    当我们通过命令行传入参数的方式调用 python 解释器去运行一个模块的时候,比如: $ python test.py 图2.1中所示的过程将开始进行.(当然这只是其中一种运行 Python 程序的方 ...

  5. java version 和javac版本不一致_解决linux下javac -version和java -version版本显示不一致...

    [javascript] view plaincopy [root@localhost usr]# $JAVA_HOME/bin/java -version bash: /bin/java: 没有那个 ...

  6. php 定时脚本执行wget无效_写了个Bug,误执行rm fr /*,瞬间背后一凉!

    作者 | 小林 来源 | 小林coding 前言 前段时间,临近五一节,想到有 5 天假期,我就开始飘了. 写个简单的 Bash 脚本都不上心了,写完连检查都不检查,直接拖到到实体服务器跑. 结果一跑 ...

  7. python控制台执行代码字符串_编写Python脚本以使用控制台命令执行

    研究是在底部,阅读之前...谢谢.在 我必须编写一个运行SQL查询的Python脚本.我创建了一个主类,名为SQLQuery.每个SQLQuery实例表示一个查询.脚本的结构必须如下所示:class ...

  8. java执行python路径_如何在Python中获取当前执行文件的路径?

    您无法直接确定正在执行的主脚本的位置 . 毕竟,有时脚本根本不是来自文件 . 例如,它可以来自交互式解释器或仅存储在存储器中的动态生成的代码 . 但是,您可以可靠地确定模块的位置,因为模块始终从文件加 ...

  9. sqlserver 查询某个时间段执行sql语句_为什么 SQL 查询不是先执行SELECT语句?

    作者:Julia Evans    译者:无明    链接:infoq.cn/article/Oke8hgilga3PTZ3gWvbg 很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别 ...

最新文章

  1. 【求助】哪个软件负责在屏幕右下角显示类似“caps lock on/off”的? - 技术封存区 - 专门网论坛 -...
  2. CentOS系统dig和nslookup的安装
  3. python批量改动指定文件夹文件名称
  4. php中border属性,css中display属性和border属性常遇问题讲解
  5. 6410 gpio控制及接口
  6. 计算机网络阶段,计算机网络的发展大致可分为四个阶段,目前人类进入了()。 - 问答库...
  7. spring boot2 整合(二)JPA(特别完整!)
  8. BZOJ3437 小P的牧场
  9. 滴滴配合警方调证不超 10 分钟;苹果否认恶意芯片报道;贝索斯建火箭中心 | 极客头条...
  10. 从二进制格雷码到任意进制格雷码(1)
  11. VBS对Excel导入bas宏文件
  12. 勒索病毒锁死文件加密
  13. Educational Codeforces Round 118 (Rated for Div. 2)/C. Poisoned Dagger
  14. android网络下载图片并且显示在图库中
  15. linux zend studio 10,Zend Studio 10发布,可编写mobile apps
  16. 国内外教育机器人生产企业及产品情况分析
  17. 【shell】使用cat来合并文件的简单用法
  18. “小灵通”的风雨往事
  19. 初学Java的练手题
  20. DFRobotGravity: 模拟甲烷气体传感器 (MQ4)工作原理

热门文章

  1. [置顶] 当我拿车钥匙的时候,刚交的女朋友跑了。。。
  2. HTML 基础知识(特殊字符的转义)
  3. iOS7的界面上移问题
  4. 下载最新Android代码的方法
  5. Windows Vista和XP系统功能大比拼
  6. 【C++】拷贝控制与资源管理
  7. php的webservice的wsdl的XML无法显示
  8. 游标对于分页存储过程
  9. 调试JDK源码-Hashtable实现原理以及线程安全的原因
  10. Windows客户端C/C++编程规范“建议”——变量和常量