Spark基础-Spark作业提交
内容整理自:
Spark提交作业流程
名词概念
Application
: 用户编写的Spark应用程序,包含了一个Driver 功能的代码和分布在集群中多个节点上运行的Executor代码Driver
: Driver即运行上述Application的main()函数并且创建SparkContext准备Spark应用程序的运行环境.在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常用SparkContext代表DriverWorker
:集群中任何可以运行 Application 代码的节点,类似于 YARN 中的 NodeManager 节点。在 Standalone 模式中指的就是通过 Slave 文件配置的 Worker 节点,在 Spark on Yarn 模式中指的就是 NodeManager 节点Executor
: Application运行在Worker 节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批ExecutorCluster Manager
:指的是在集群上获取资源的外部服务,目前有:- Standalone:Spark原生的资源管理,由Master负责资源的分配
- Hadoop Yarn:由YARN中的ResourceManager负责资源的分配
执行流程
两个核心:DAGScheduler
和TaskScheduler
详情见: 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模式
流程描述
客户端启动后直接运行用户程序,启动Driver相关的工作:DAGScheduler和BlockManagerMaster等。
客户端的Driver向Master注册。
Master还会让Worker启动Executor。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
ExecutorBackend启动后会向Driver的SchedulerBackend注册。Driver的DAGScheduler解析作业并生成相应的Stage,每个Stage包含的Task通过TaskScheduler分配给Executor执行。
所有stage都完成后作业结束
Standalone Cluster模式
客户端提交作业给 master
Master选择一个 Worker节点启动 Driver,即
SchedulerBackend
。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程Master让其余 Worker启动 Executor,即
ExecutorBackend
。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程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 模式
Spark Yarn Client向YARN的
ResourceManager
申请启动Application Master
ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行联系进行资源的分派
Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container)
ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task
Client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向Driver汇报运行的状态和进度
应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己
YARN-Cluster 模式
在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作业的客户端机器上,可以实时看到详细的日志信息, 方便追踪和排查错误,用于测试