Spark 基础 - 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
:指的是在集群上获取资源的外部服务,目前有:- 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,比如 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 作业的客户端机器上, 可以实时看到详细的日志信息,方便追踪和排查错误,用于测试