大数据系列之Spark作业提交流程剖析

大数据系列之Spark作业提交流程剖析

1. 术语名词解释

​ Spark架构使用了分布式计算中master-slave模型,master是集群中含有master进程的节点,slave是集群中含有worker进程的节点。

  • Driver Program :运⾏main函数并且新建SparkContext的程序。
  • Application:基于Spark的应用程序,包含了driver程序和集群上的executor。
  • Cluster Manager:指的是在集群上获取资源的外部服务。目前有三种类型:
    • Standalone: spark原生的资源管理,由Master负责资源的分配;
    • Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架;
    • Hadoop Yarn: 主要是指Yarn中的ResourceManager;
  • Worker Node: 集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slaves文件配置的Worker节点,在Spark on Yarn模式下就是NodeManager节点。
  • Executor:是在一个worker node上为某应⽤启动的⼀个进程,该进程负责运⾏行任务,并且负责将数据存在内存或者磁盘上。每个应⽤都有各自独立的executor。
  • Task :被送到某个executor上的工作单元。
    在这里插入图片描述

2. Driver、Worker、Executor功能介绍

2.1 Driver功能介绍

​ Driver运行应用程序的时候,具有main方法,且创建了SparkContext,是整个程序运行的调度的核心。内部会有高层调度器DAGScheduler和底层调度器TaskScheduler,高层调度器把整个作业Job划分成几个小的阶段Stage,底层调度器负责每个阶段内的任务Task该怎么去执行。由SchedulerBackend管理整个集群中为当前运行的应用程序分配的计算资源,分配的计算资源其实就是Executors,同时向Master注册当前的应用程序,如果注册成功,Master会向其分配资源。下一步根据action级别的操作出发job,job中会有一系列的RDD,从后往前推,如果是宽依赖的话就划分为不同的Stage,划分完成后提交给底层调度器TaskScheduler,TaskScheduler拿到具体的任务的集合,然后根据数据的本地性原则,把任务发放到对应的Executor上去执行,当Executor运行成功或者出现状况的话都会向Driver进行汇报,最后运行完成之后关闭SparkContext,所创建的对象也会随之关闭。

2.2 Worker功能介绍

主要功能:管理当前节点内存,CPU的使用状况,接收Master分配过来的资源指令,通过ExecutorRunner启动程序分配任务,Worker就类似于包工头,管理分配新进程,做计算的服务,相当于Process服务。
需要注意的是:
1.Worker不会汇报当前信息给Master,Worker心跳给Master主要只有workId,它不会发送资源信息以心跳的方式给Mater,Master分配的时候就知道Worker,只有出现故障的时候才会发送资源。
2.Worker不会运行代码,具体运行的是Executor是可以运行具体Appliaction写的业务逻辑代码,操作代码的节点,它不会运行程序的代码的。

2.3 Executor功能介绍

​ Executor是运行在Worker所在的节点上为当前应用程序而开启的进程里面的一个对象,这个对象负责了具体Task的运行,具体是通过线程池并发执行和复用的方式实现的。这里要补充一点:Hadoop的MR是运行在一个又一个JVM上,而JVM比较重量级且不能被复用,
而Spark中是通过线程池并发执行和复用的方式执行Tasks,极大的方便了迭代式计算,所以Spark的性能大大提高。每个Task的计算逻辑一样,只是处理的数据不同而已。Spark应用程序的运行并不依赖于Cluster Manager,如果应用程序注册成功,Master就已经提前分配好了计算资源,运行的过程中跟本就不需要Cluster Manager的参与(可插拔的),这种资源分配的方式是粗粒度的。关于数据本地性,是在DAGScheduler划分Stage的时候确定的,TaskScheduler会把每个Stage内部的一系列Task发送给Executor,而具体发给哪个Executor就是根据数据本地性原则确定的。

3. 作业提交

3.1 Driver运行在Worker上的执行流程

在这里插入图片描述
作业执行流程描述

  1. 客户端提交作业给Master。
  2. Master让一个Worker启动Driver,即SchedulerBackend。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程。
  3. 另外Master还会让其余Worker启动Exeuctor,即ExecutorBackend。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
  4. ExecutorBackend启动后会向Driver的SchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行。
  5. 所有stage都完成后作业结束。
3.2 Driver运行在客户端

在这里插入图片描述

作业执行流程描述

  1. 客户端启动后直接运行用户程序,启动Driver相关的工作:DAGScheduler和BlockManagerMaster等。
  2. 客户端的Driver向Master注册。
  3. Master还会让Worker启动Exeuctor。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
  4. ExecutorBackend启动后会向Driver的SchedulerBackend注册。Driver的DAGScheduler解析作业并生成相应的Stage,每个Stage包含的Task通过TaskScheduler分配给Executor执行。
  5. 所有stage都完成后作业结束。
3.3 YARN-Client模式

在这里插入图片描述

作业执行流程描述

  1. Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContent初始化中将创建DAGScheduler和TASKScheduler等,由于我们选择的是Yarn-Client模式,程序会选择YarnClientClusterScheduler和YarnClientSchedulerBackend;
  2. ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行联系进行资源的分派;
  3. Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container);
  4. 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task;
  5. Client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向Driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
  6. 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己。
3.4 YARN-Cluster模式

​ 在YARN-Cluster模式中,当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:第一个阶段是把Spark的Driver作为一个ApplicationMaster在YARN集群中先启动;第二个阶段是由ApplicationMaster创建应用程序,然后为它向ResourceManager申请资源,并启动Executor来运行Task,同时监控它的整个运行过程,直到运行完成。
在这里插入图片描述

作业执行流程描述

  1. Spark Yarn Client向YARN中提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等;
  2. ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化;
  3. ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束;
  4. 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等;
  5. ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
  6. 应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己。

YARN-Client与YARN-Cluster 区别

​ 理解YARN-Client和YARN-Cluster深层次的区别之前先清楚一个概念:Application Master。在YARN中,每个Application实例都有一个ApplicationMaster进程,它是Application启动的第一个容器。它负责和ResourceManager打交道并请求资源,获取资源之后告诉NodeManager为其启动Container。从深层次的含义讲YARN-Cluster和YARN-Client模式的区别其实就是ApplicationMaster进程的区别。

  • YARN-Cluster模式下,Driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而YARN-Cluster模式不适合运行交互类型的作业;

  • YARN-Client模式下,Application Master仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值