Spark基础-Spark作业提交

内容整理自:

  1. Spark 架构与作业执行流程

Spark提交作业流程

名词概念

  • Application: 用户编写的Spark应用程序,包含了一个Driver 功能的代码和分布在集群中多个节点上运行的Executor代码

  • Driver: Driver即运行上述Application的main()函数并且创建SparkContext准备Spark应用程序的运行环境.在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常用SparkContext代表Driver

  • Worker:集群中任何可以运行 Application 代码的节点,类似于 YARN 中的 NodeManager 节点。在 Standalone 模式中指的就是通过 Slave 文件配置的 Worker 节点,在 Spark on Yarn 模式中指的就是 NodeManager 节点

  • Executor: Application运行在Worker 节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor

  • Cluster Manager:指的是在集群上获取资源的外部服务,目前有:

    1. Standalone:Spark原生的资源管理,由Master负责资源的分配
    2. Hadoop Yarn:由YARN中的ResourceManager负责资源的分配

执行流程

两个核心:DAGSchedulerTaskScheduler
image.png
详情见: Spark进阶-Spark调度系统

Spark三种作业提交模式

local模式

  • local模式下,没有所谓的master+worker这种概念
  • local模式,相当于,启动一个本地进程,然后在一个进程内,模拟spark集群中作业的运行一个spark作业,就对应了进程中的一个或多个executor线程,就开始执行,包括作业的调度,task分配

Standalone提交模式

standalone模式提交, 需要将master设置成spark://master_ip:port,比如spark://192.168.75.101:7077

Standalone Client模式

image.png

流程描述

  1. 客户端启动后直接运行用户程序,启动Driver相关的工作:DAGScheduler和BlockManagerMaster等。

  2. 客户端的Driver向Master注册。

  3. Master还会让Worker启动Executor。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。

  4. ExecutorBackend启动后会向Driver的SchedulerBackend注册。Driver的DAGScheduler解析作业并生成相应的Stage,每个Stage包含的Task通过TaskScheduler分配给Executor执行。

  5. 所有stage都完成后作业结束

Standalone Cluster模式

image.png

  1. 客户端提交作业给 master

  2. Master选择一个 Worker节点启动 Driver,即SchedulerBackend。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程

  3. Master让其余 Worker启动 Executor,即ExecutorBackend。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程

  4. ExecutorBackend启动后会向Driver的SchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行

Standalone Client和Standalone Cluster区别

  • client mode下,在哪台机器上用spark-submit脚本提交application,driver就会在那台机器上启动
  • cluster mode下,driver会通过master进程,随机被分配给某一个worker进程来启动

Yarn提交模式

Yarn-Client 模式

image.png

  1. Spark Yarn Client向YARN的ResourceManager申请启动Application Master

  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汇报运行的状态和进度

  6. 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己

YARN-Cluster 模式

image.png
在YARN-Cluster模式中,当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:

  • 第一个阶段是把Spark的Driver作为一个ApplicationMaster在YARN集群中先启动;
  • 第二个阶段是由ApplicationMaster创建应用程序,然后为它向ResourceManager申请资源,并启动Executor来运行Task,同时监控它的整个运行过程,直到运行完成

YARN-Client 与 YARN-Cluster 区别

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

  • YARN-Client模式下,Application Master仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开. Driver运行在提交spark作业的客户端机器上,可以实时看到详细的日志信息, 方便追踪和排查错误,用于测试